【发布时间】:2013-11-26 18:16:35
【问题描述】:
我正在开发一个视频编码应用程序,我想防止它在托管 Activity 进入后台或屏幕循环关闭/打开时停止。
我的编码器架构源自出色的CameraToMpegTest 示例,并在 GLSurfaceView 中添加了显示相机帧(请参阅下面的 Github 链接)。我目前正在使用两种状态的解决方案进行后台录制:
当托管 Activity 在前台时,每次调用
GLSurfaceView.Renderer的onDrawFrame时编码一个视频帧。这使我可以突发访问 GLSurfaceView 的 EGL 状态,以免阻塞排队到渲染器线程的其他事件。当宿主 Activity 进入后台时,停止
onDrawFrame编码并在循环内的另一个后台线程上编码帧。此模式与 CameraToMpegTest 示例相同。
然而如果屏幕关闭,GLSurfaceView 的 EGLContext 会丢失,并且会重新调用 onSurfaceCreated。在这种情况下,我们必须重新创建连接到 MediaCodec 的输入 Surface 的 EGL 窗口表面。不幸的是,第二次调用eglCreateWindowSurface 产生:
E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API
打电话之前,我release all EGL resources connected to the Android Surface。
有没有办法交换连接到 MediaCodec 的输入 Surface 的 EGLSurface?
我的测试应用程序的完整来源在Github。 Main Activity.
更新我将在这里学到的经验应用到基于 MediaCodec 和 MediaMuxer 类的video sdk for Android 中。希望对您有所帮助!
【问题讨论】:
-
MediaCodec不应受到(或什至意识到)在后台的影响。参见例如在 Android 4.4 中添加的screenrecord命令,它在幕后愉快地运行。它正在编码 anything 的事实意味着它仍在接收输入数据,有人猜测是某些东西正在影响Camera。我不明白为什么它会导致预览Surface为空白,而预览byte[]有真实数据。 -
更新了我的问题。我现在能够过渡到后台录制(无 GLSurfaceView 显示),然后是前台录制(GLSurfaceView 显示)除了,在此期间发生屏幕关闭/开启事件...
-
您在主要活动 onPause() 中缺少
glSurfaceView.onPause()。不确定这是否重要。我明天也许可以玩一下,看看我是否可以复制这种行为。 -
Activity 的
onPause()调用一个方法,该方法使用glSurfaceView.queueEvent()对必须在渲染线程上发生的操作进行排队,然后glSurfaceView.onPause()暂停它。 See here -
屏幕关闭/打开会导致 GLSurfaceView 的 EGLContext 丢失,因此我们必须创建一个新的 CodecInputSurface.mEGLSurface 来共享新的 EGLContext。但是在断开 MediaCodec 输入 Surface 时遇到问题,以避免在
eglCreateWindowSurface上出现already connected to another API错误。这应该可能吗?
标签: android android-mediacodec