我正在开发一个视频编码应用程序,我想防止在托管 Activity 进入后台或屏幕循环关闭/打开时停止。
我的编码器架构源自出色的CameraToMpegTest示例,并添加了将相机帧显示到 GLSurfaceView(请参阅下面的 Github 链接)。我目前正在使用两种状态的解决方案执行后台录制:
当托管 Activity 位于前台时,在每次调用
GLSurfaceView.Renderer
's时编码一个视频帧onDrawFrame
。这使我可以突发访问 GLSurfaceView 的 EGL 状态,以免阻塞排队到渲染器线程的其他事件。当宿主 Activity 进入后台时,
onDrawFrame
在循环内的另一个后台线程上停止编码和编码帧。此模式与 CameraToMpegTest 示例相同。
但是,如果屏幕关闭,GLSurfaceView 的 EGLContext 会丢失,并且onSurfaceCreated
会发生新的调用。在这种情况下,我们必须重新创建连接到 MediaCodec 的输入 Surface 的 EGL 窗口表面。不幸的是,这第二次调用eglCreateWindowSurface
产生:
E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API
在调用之前,我释放了所有连接到 Android Surface 的 EGL 资源。
有没有办法交换连接到 MediaCodec 输入 Surface 的 EGLSurface?
更新我将这里学到的经验应用到基于 MediaCodec 和 MediaMuxer 类的 Android 视频 sdk 中。希望能帮助到你!