跨 Activity 移动 SurfaceView
Move SurfaceView across Activities
我正在开发一个视频应用程序,用户可以在其中观看视频、在需要时全屏打开它并返回默认视图等等。由于即将进行的解释,我正在使用 ExoPlayer,最近切换到默认的 MediaPlayer。
我需要更改 "on the fly" 播放器的表面。我需要使用同一个播放器在活动之间显示视频,没有延迟显示图像。使用 Exoplayer,解码器等待下一个关键帧在空表面上绘制像素。
所以我需要使用同一个 Surface,这样我就不需要每次都推送一个新的 Surface,只需将 Surface 附加到 View 父级即可。 Surface 可以保持不变,但如果我分离 SurfaceView 以从另一个 activity 检索它并重新附加它,则内部 Surface 会被破坏。
那么有没有办法在不同的活动中保持相同的表面?有服务吗?
我知道这个问题有点难理解,我会在评论中解释指定部分是请求。
与 SurfaceView 或 TextureView 关联的 Surface 通常会在 Activity 停止时销毁。可以解决此问题。
一种方法内置于 TextureView 中,architecture doc, and demonstrated in the "double decode" activity in Grafika. The goal of the activity is to continue playing a pair of videos while the activity restarts due to screen rotation, not pausing at all. If you follow the code you can see how the return value from onSurfaceTextureDestroyed()
is used to keep the SurfaceTexture alive, and how TextureView#setSurfaceTexture() 中描述了将 SurfaceTexture 附加到新视图。它有一点技巧——setSurfaceTexture()
需要发生在 onCreate()
,而不是 onSurfaceTextureAvailable()
——但它相当简单。
该示例使用 MediaCodec 输出进行视频播放,但它同样适用于需要 Surface 进行输出的任何内容——只是 create a Surface from the SurfaceTexture。
如果您不介意深入了解 OpenGL ES,您可以创建自己的 SurfaceTexture,独立于视图和活动,然后自己将其渲染到当前的 SurfaceView。 Grafika 的 "texture from camera" activity 使用来自摄像机的实时视频执行此操作(尽管它不会尝试在 Activity 重新启动后保留它)。
我正在开发一个视频应用程序,用户可以在其中观看视频、在需要时全屏打开它并返回默认视图等等。由于即将进行的解释,我正在使用 ExoPlayer,最近切换到默认的 MediaPlayer。
我需要更改 "on the fly" 播放器的表面。我需要使用同一个播放器在活动之间显示视频,没有延迟显示图像。使用 Exoplayer,解码器等待下一个关键帧在空表面上绘制像素。
所以我需要使用同一个 Surface,这样我就不需要每次都推送一个新的 Surface,只需将 Surface 附加到 View 父级即可。 Surface 可以保持不变,但如果我分离 SurfaceView 以从另一个 activity 检索它并重新附加它,则内部 Surface 会被破坏。
那么有没有办法在不同的活动中保持相同的表面?有服务吗?
我知道这个问题有点难理解,我会在评论中解释指定部分是请求。
与 SurfaceView 或 TextureView 关联的 Surface 通常会在 Activity 停止时销毁。可以解决此问题。
一种方法内置于 TextureView 中,architecture doc, and demonstrated in the "double decode" activity in Grafika. The goal of the activity is to continue playing a pair of videos while the activity restarts due to screen rotation, not pausing at all. If you follow the code you can see how the return value from onSurfaceTextureDestroyed()
is used to keep the SurfaceTexture alive, and how TextureView#setSurfaceTexture() 中描述了将 SurfaceTexture 附加到新视图。它有一点技巧——setSurfaceTexture()
需要发生在 onCreate()
,而不是 onSurfaceTextureAvailable()
——但它相当简单。
该示例使用 MediaCodec 输出进行视频播放,但它同样适用于需要 Surface 进行输出的任何内容——只是 create a Surface from the SurfaceTexture。
如果您不介意深入了解 OpenGL ES,您可以创建自己的 SurfaceTexture,独立于视图和活动,然后自己将其渲染到当前的 SurfaceView。 Grafika 的 "texture from camera" activity 使用来自摄像机的实时视频执行此操作(尽管它不会尝试在 Activity 重新启动后保留它)。