我正在开发一个视频应用,用户可以在其中观看视频,如果需要可以全屏打开视频,然后返回默认视图等等。由于即将到来的解释,我使用ExoPlayer并最近切换到默认的MediaPlayer。
我需要在播放器的Surface面上“改变”。我需要使用相同的播放器在活动中显示视频,没有延迟显示图像。使用Exoplayer,解码器等待下一个关键帧在空Surface上绘制像素。
所以我需要使用相同的Surface,所以我不需要每次都推新表面,只需将表面附加到View父级。 Surface可以保持不变但是如果我分离SurfaceView以从另一个活动中检索它并重新连接它,则内部Surface将被销毁。
那么有没有办法让不同的活动保持相同的Surface?有服务吗?
我知道这个问题有点奇怪,我会在评论中解释指定的部分是请求。
答案 0 :(得分:4)
当Activity停止时,通常会销毁与SurfaceView或TextureView关联的Surface。可以解决此问题。
一种方法内置于TextureView中,并在architecture doc中进行了描述,并在double decode中的“Grafika”活动中进行了演示。该活动的目标是在活动由于屏幕旋转而重新启动时继续播放一对视频,而不是暂停。如果您按照代码操作,则可以看到onSurfaceTextureDestroyed()
的返回值如何用于保持SurfaceTexture的活动状态,以及TextureView#setSurfaceTexture()如何将SurfaceTexture附加到新视图。有一点诀窍 - setSurfaceTexture()
需要onCreate()
,而不是onSurfaceTextureAvailable()
- 但它相当简单。
该示例使用MediaCodec输出进行视频播放,但它对于使用Surface输出的任何内容都同样有效 - 只需create a Surface from the SurfaceTexture。
如果你不介意深入了解OpenGL ES,你可以创建自己的SurfaceTexture,独立于视图和活动,并自己渲染到当前的SurfaceView。 Grafika的“相机纹理”活动使用来自相机的实时视频(虽然它不会尝试在重新启动活动时保留它)。