Android MediaCodec eglSwapBuffer 在异步模式下阻塞 GPU

Sam*_*598 3 android android-mediacodec

我有一个视频效果应用程序,我使用 OpenGL 绘制到帧缓冲区对象,然后将生成的纹理绘制到显示器,然后是 MediaCodec 输入表面(如果应用程序正在编码)。

我最初在同步模式下为 API 18 编写了编码器(基于大片示例)。我最近将它切换到 API 21 和异步模式。

它可以很好地录制视频,我相信我已经正确设置了所有内容。然而,对 eglSwapBuffers 的调用似乎会导致帧速率显着下降。

如果我删除所有其他 OpenGL 调用,它会运行得更好,但我渲染的东西并不那么昂贵(它可以每帧渲染好多次)。更改编码器设置(即从 640x360 @ 2Mbps 到 1920x1080 @ 16Mbps)几乎没有区别。

唯一使它运行得更快的是删除对 eglSwapBuffers 的调用(它将缓冲区数据发送到编码器)。

我的理解是输出缓冲区不会像以前那样阻塞异步模式下的调用。我错了吗?是否有调用渲染器的首选方法,或异步在单独线程上渲染的方法?

任何关于从哪里开始的帮助或想法将不胜感激,谢谢!

mst*_*sjo 5

即使在异步模式下,输出缓冲区仍会阻塞编码器 - 您需要快速处理输出并将输出缓冲区在异步编码器输出回调调用后返回到编码器,否则最终会像以前一样阻塞输入。

同步和异步模式之间的唯一区别是您不需要轮询这些事件,而是获得回调。