我已经为这个问题苦苦挣扎了一个多星期了,很可能这是一个错误高通 GPU/硬件视频编码器。由于我们被迫发布该应用程序,并且他们的开发者论坛没有提供任何反馈,因此我也将其发布在这里,希望有人能够提供一些线索,甚至更好的解决方法,以便编码器中的错误得到解决未触发。
应用程序从 Surface 进行编码。当某些图像渲染到表面时,编码器在同一位置失败(100%)(当当前正在编码的帧是关键帧时)。崩溃时编码器的 Logcat 输出为(最后几行以非常高的速率重复):
11-26 11:41:33.312: E/OMX-VENC-720p(25949): ERROR: async_msg_process() - Error statuscode = 1
11-26 11:41:33.312: E/ACodec(29317): [OMX.qcom.video.encoder.avc] ERROR(0x80001009)
11-26 11:41:33.312: E/MediaCodec(29317): Codec reported an error. (omx error 0x80001009, internalError -2147483648)
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: venc_use_buf:set input buffer failed
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: in dev_use_buf
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: empty_buffer_done() failed!
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_fbd_count at o/p flush = 306
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_etb_count at i/p flush = 313
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: dev_fill_buf() Failed
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: FTBProxy() failed!
我也可以复制它Grafika https://github.com/google/grafika通过简单地替换记录总帐应用程序绘制两种几何形式,并以横向模式全屏绘制有问题的图像之一,并将比特率更改为更高的值(7Mbps)。
对于较大的比特率,编码器崩溃发生得更快。
这是一个image http://turl.ca/tqzs这似乎很容易打破它,这是记录FBOActivity.java http://pastebin.com/gYXn5UWa进行所需的更改。
我使用 Grafika 进行了测试,编码器在三星 S4 国际版和原始 Nexus 4 上都会崩溃。使用我们的软件(比渲染纯图像稍微复杂一些),它仍然会在两者上崩溃。没有在任何其他 Adreno 设备上进行测试。在配备 Mali 400 GPU 的三星 S3 上,它运行良好。
在 4Mbps 时,我们应用程序中的编码器在 S4 和 N4 上仍然崩溃,但稍后会崩溃。 Grafika 在 N4 上的同一个地方崩溃了,但在 S4 上却没有。
编辑:根据下面的评论,当从缓冲区编码相同的图像时也可以复制它。各种测试似乎缩小了重现它的条件:高通设备上的 h264 硬件编码器,对许多帧编码静态图像(由于相似的帧,这决定了编码器中的比特率非常低),对关键帧进行编码时出现错误(仅当对某些图像进行编码时才会出现错误,这些图像似乎具有更多细节,即需要许多位进行帧内编码)。