【问题标题】:Play and split video on a wall of screens在屏幕墙上播放和分割视频
【发布时间】:2022-01-16 03:29:32
【问题描述】:

我正在开发一个 Android TV 应用项目。我需要将一个视频分成等份的 2、3 或 X 屏幕。每个屏幕上都有一个 Android 电视棒,上面插着我的应用程序。 例如: 如果我们有 2 个屏幕,每个屏幕将显示 50% 的播放视频。 如果我们有 3 个屏幕,每个屏幕将显示 33,33% 的播放视频。 如果我们有 4 个屏幕,每个屏幕将显示 25% 的播放视频。

这里有一张图片可以更好地理解我的期望:

视频在墙上的每个屏幕上同时播放,关于这一点我已经考虑过了:一个屏幕将是 NTP(网络时间协议)主机,另一个屏幕将是从机)。同步播放器。

我的第一个想法是在每个应用程序上都有完整的视频,播放它并只显示我需要的部分。我怎样才能做到这一点?有可能吗?

提前感谢您的帮助。

【问题讨论】:

    标签: android kotlin android-layout logic android-tv


    【解决方案1】:

    我不清楚你将如何处理高度(例如,如果你有一个 1080p 视频但跨越四个屏幕,你将不得不切断 3/4 的像素以“放大" 在屏幕上显示),但有些想法:

    如果您不必担心 HDCP,HDMI 分配器可能会起作用。如果不是,但这是一次性活动(例如,为贸易展设置信息亭),那么创建单独的视频文件可能是风险最小和最简单的,它们实际上是按照你想要的方式分割的。如果这必须更加灵活/稳健,那么这将是一段旅程,有一些选择。

    最简单

    您应该能够根据需要设置一个 SurfaceView,并为每个设备调整偏移量。例如,屏幕 2 可能有一个 SurfaceView 集,其宽度为 #_of_screens * 1920(或任何适当的分辨率),X 起始位置为 -1920。需要注意的是,我不知道这可以支持多大的 SurfaceView。例如,这可能只适用于两个屏幕,但不适用于十个屏幕。

    您可以尝试使用VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING 根据您需要显示的大小来缩放视频输出。

    适用于功能强大的设备

    如果您使用的设备足够强大,您可以在屏幕外渲染到 SurfaceTexture,然后将纹理的一部分复制到 GLSurfaceView。如果这是 DRM 内容,您还必须检查 EGL_EXT_protected_content 扩展。

    适用于 Android 10+

    如果设备运行的是 Android 10 或更高版本,SurfaceControl 可能适合您。您可以使用 SurfaceControl.Transaction 来操作 SurfaceControl,包括映射缓冲区坐标的方式。基本代码最终看起来像这样:

    new SurfaceControl.Transaction()
        .setGeometry(surfaceControl, sourceRect, destRect, Surface.ROTATION_0)
        .apply();
    

    ExoPlayer v2 演示中还有一个 SurfaceControl 示例:https://github.com/google/ExoPlayer/tree/release-v2/demos/surface

    【讨论】:

    • 谢谢,我会在几天内检查所有这些并告诉您是否可以,我会验证您的答案。非常感谢您的时间和解释??
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多