mediacodec进行aac解码避雷

最近除了春招外也在从事音视频的项目,最近在mediacodec解码遇到的坑进行总结,之前一直以为编码和解码的配置差不多,但实际还是遇到不少不同的问题,百度上答案大多也讲不清楚问题,希望这篇文章给各位同仁带来帮助。

1.dequeInputBuffer抛出异常:illegalState:codec 0xe State6

这个错误是因为,编码器没有设置一个csd_0的参数,网上就一篇博文对此描述清楚,其它博文都是抄袭的。事实上,csd_0的前5位是版本号(aac_main lc等),然后4位是采样率(0x04是44100),然后4位是信道数(2通道是2,1通道是1),后三位固定是0,于是就是:

0001001000001000 即0x12 0x08,因此要做如下设置:

byte[] data = new byte[]{(byte) 0x12, (byte)0x08};
ByteBuffer csd_0 = ByteBuffer.wrap(data);
mediaFormat.setByteBuffer("csd-0", csd_0);

如果这个不设置,或者设置有错,就会报上述问题。当然,其它参数如果设置的有问题也会这样,出现此类问题不妨多细看参数是否设错了,其实还有另一种情况configure出错,也是要查看参数设置是否有问题,像笔者就不慎把createdecode写成encode,标志位放错,就会报这种问题。

2.dequeOutputBuffer抛出异常:illegalState:codec 0xe State6

这个问题笔者多次测试发现和这句有关:

mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1);

有些情况是可以,有些情况如果音频ADTS帧头和音频单帧大小不匹配或者其它版本问题,就会出现问题,个人建议直接把KEY_IS_ADTS设置成0,然后装数据时必须拿掉帧头的7个字节的数据,否则会导致Mediacodec塞入数据没有数据输出的情况(亲测)。

3.mediacodec解码出来的音频时间变长,音质拖拉杂音增多变差。

这个地方网上很多都没有很好的解释,其实输入数据时byte数组大部分情况下是直接初始化好了,如果装数据的byte设置的过长过大,byte后半部分没被填充的地方就会被设置成零,这些数据也被塞入到解码器中,相当于把这堆零也拿去解码了,这样就导致了上述问题,所以如果音质出现问题建议直接把输入数据打印出来,用其它可靠途径(比如ffmpeg等)解码一个pcm对比mediacodec的pcm的十六进制数据,会有所发现的。

笔者也只是应届毕业生才疏学浅,如果有其它问题欢迎在下面和笔者交流,后续会把源码进行封装更新在另一个博客上。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部