我正在使用MediaCodec使用Surface方法编码H.264视频的Android应用。我的目标是Android 5.0,我已经关注了bigflake.com的所有示例和示例(两年前我开始研究这个项目,所以我经历了所有问题和其他问题)。
在Nexus 6(使用Qualcomm硬件编码器执行此操作)上,所有功能都很好用,而且我能够在多个输出中实时录制带有AAC音频的实时1440p视频(从MP4本地文件,到http流媒体)。 但是当我尝试在使用Mediatek芯片组的索尼Android电视(运行Android 5.1)上使用该应用程序时,即使从编码级别开始,所有地狱都会破裂。更具体一点:
基本上不可能使硬件编码器正常工作(即" OMX.MTK.VIDEO.ENCODER.AVC")。使用最基本的设置(在MediaCodec的级别上成功),我将永远不会从中获取输出缓冲区,只有奇怪的,垃圾邮件,logcat错误消息,指出驱动程序每次应编码帧时都遇到错误,像这样:
01-20 05:04:30.575 1096-10598/? E/venc_omx_lib: VENC_DrvInit failed(-1)!
01-20 05:04:30.575 1096-10598/? E/MtkOmxVenc: [ERROR] cannot set param
01-20 05:04:30.575 1096-10598/? E/MtkOmxVenc: [ERROR] EncSettingH264Enc fail
有时,尝试将其配置为以640 x 640像素分辨率进行编码将成功使编码器实际编码内容,但我注意到的第一个问题是它只会创建一个关键帧,也就是说,第一个视频帧。在此之后,永远不会创建任何关键帧,只有P帧。当然,i-frame-interval被设置为一个不错的值,并且在其他设备上没有任何问题。毋庸置疑,这使得无法在顶部创建可搜索的MP4文件或任何类型的可流传输解决方案。
大多数时候,在释放编码器之后,logcat将无休止地开始发送垃圾邮件"等待输入框架被释放..."这基本上需要重新启动设备,因为无论如何都无法从那一点起作用。
在没有问题的情况下,在简单的发布()后破坏,没有问题 - 硬件编码器确保它不能再次创建,并且它回退到通用的SOFTWARE avc谷歌编码器。 hich ofcourse基本上是一个模拟编码器,当试图编码大于160p视频的任何东西时,它几乎没有发出错误......
所以,我的问题是:有没有希望让这个MediaCodec API真正在这样的设备上运行?我的理解是,谷歌/制造商(在这种情况下,索尼)进行了一些CTS测试,这些测试允许开发人员真正认为在支持Android 5.1的设备上支持API。我错过了一些明显的东西吗?有没有人真的尝试这样做(一个简单的MediaCodec视频编码测试)并成功了?真的很令人沮丧!
PS:值得一提的是,甚至索尼都没有为这台电视机提供录制功能,无论如何,很多人都在抱怨。所以,我的猜测是,这听起来更像是一个Mediatek问题,但是,在这种情况下,Android的CTS究竟是什么呢?