3

我正在开发一个视频应用程序,用户可以在其中观看视频,如果需要全屏打开它,然后返回默认视图等等。由于即将进行的解释,我正在使用 ExoPlayer,最近切换到默认的 MediaPlayer。

我需要“即时”更改播放器的表面。我需要使用同一个播放器在活动之间显示视频,而不会延迟显示图像。使用 Exoplayer,解码器等待下一个关键帧在空的 Surface 上绘制像素。

所以我需要使用相同的 Surface,所以我不需要每次都推送一个新的 Surface,只需将 Surface 附加到 View 父级即可。Surface 可以保持不变,但如果我分离 SurfaceView 以从另一个活动中检索它并重新附加它,则内部 Surface 将被破坏。

那么有没有办法在不同的活动中保持相同的 Surface 呢?与服务?

我知道这个问题理解起来有点奇怪,我会在评论中解释指定部分是请求。

4

1 回答 1

4

与 SurfaceView 或 TextureView 关联的 Surface 通常会在 Activity 停止时被销毁。可以解决此问题。

一种方法内置在 TextureView 中,并在架构文档中进行了描述,并在Grafika的“双重解码”活动中进行了演示。该活动的目标是在活动因屏幕旋转而重新启动时继续播放一对视频,而不是完全暂停。如果您遵循代码,您可以看到返回值如何用于保持 SurfaceTexture 活动,以及TextureView#setSurfaceTexture()如何将 SurfaceTexture附加到新视图。它有一点技巧——需要在 中发生,而不是——但它相当简单。onSurfaceTextureDestroyed()setSurfaceTexture()onCreate()onSurfaceTextureAvailable()

该示例使用 MediaCodec 输出进行视频播放,但它同样适用于任何需要 Surface 作为输出的东西——只需从 SurfaceTexture 创建一个 Surface 即可

如果您不介意深入到 OpenGL ES,您可以创建自己的 SurfaceTexture,独立于 Views 和 Activity,然后自己将其渲染到当前的 SurfaceView。Grafika 的“来自相机的纹理”活动使用来自相机的实时视频来执行此操作(尽管它不会尝试在 Activity 重新启动时保留它)。

于 2015-02-26T16:58:44.747 回答