Android 9 AAC解码器使用ffmpeg编码文件输出零样本
我有一些自动测试,尝试使用Android的Android 9 AAC解码器使用ffmpeg编码文件输出零样本,android,android-mediacodec,aac,android-9.0-pie,mediaextractor,Android,Android Mediacodec,Aac,Android 9.0 Pie,Mediaextractor,我有一些自动测试,尝试使用Android的MediaDecoder和MediaExtractor将一些m4a文件解码为PCM数据。这些文件是使用各种编码器生成的:、ffmpeg(使用fdk或默认aac编码器)、iOS 在Android 9上,使用ffmpeg创建的剪辑测试失败,导致PCM文件为空。同样的剪辑在旧版本的Android上可以很好地解码 我仔细检查了我的代码,解码过程按预期进行: 我使用MediaExtractor 将其放入编解码器 从编解码器中取出输出缓冲区 问题是,当最后一个可
MediaDecoder
和MediaExtractor
将一些m4a文件解码为PCM数据。这些文件是使用各种编码器生成的:、ffmpeg(使用fdk或默认aac编码器)、iOS
在Android 9上,使用ffmpeg
创建的剪辑测试失败,导致PCM文件为空。同样的剪辑在旧版本的Android上可以很好地解码
我仔细检查了我的代码,解码过程按预期进行:
- 我使用
MediaExtractor
- 将其放入编解码器
- 从编解码器中取出输出缓冲区李>
MediaCodec.buffer\u FLAG\u END\u的输出缓冲区退出队列时,所有输出缓冲区都是空的
然后我注意到使用MediaExtractor.getTrackFormat(int-track)
从音频文件中提取的MediaFormat
信息包含一个未记录的编码器延迟键
对于android 8及更低版本,该键仅适用于使用iTunesMPB
标记信息编码的m4a剪辑。以下是我为测试文件获得的值的摘要:
iOS-encoded file: 2112 frames
fdkaac with iTunSMPB tag: 2048 frames
fdkaac with ISO delay info: key not present
ffmpeg: key not present
ffmpeg (fdk): key not present
在Android 9上,我得到了以下结果:
iOS-encoded file: 2112 frames
fdkaac with iTunSMPB tag: 2048 frames
fdkaac with ISO delay info: 2048 frames
ffmpeg: 45158 frames
ffmpeg (fdk): 90317 frames
看起来有什么变化了,MediaExtractor
现在能够检索所有测试文件的编码器延迟。这在理论上是好的,因为没有“编码器延迟”
信息的文件在解码的PCM数据中确实显示延迟(这是一个已知问题)
但是。。。虽然“fdkaac with ISO delay info”案例的值是正确的,并导致没有初始填充的有效PCM文件(最后!),但ffmpeg生成的文件的值看起来很大,可能是错误的
我知道ffmpeg情况下的实际编码器延迟值是1024,而ffmpeg(fdk)情况下的实际编码器延迟值是2048,我认为提取格式中key的高值是文件为空的原因
事实上,如果我尝试在将“编码器延迟”
键传递给MediaCodec.configure(…)
之前将其格式设置为0,我将获得具有预期延迟的正确未压缩数据
我的猜测是,MediaExtractor
encoder delay value retrieval有一些bug,但可能有一些我忽略了
由于ffmpeg非常流行,我的许多应用程序用户很可能会尝试导入使用它生成的文件,目前我看不到一个简单的解决方案
有人有什么建议/解决方法吗?我在安卓问题跟踪器上打开了一个问题:
现在我刚刚实现了一个解决方法:当“编码器延迟”值出现在MediaFormat
对象中,并且它是一个不可能的高值时,我只是将其设置为零。比如:
if (format.containsKey("encoder-delay") && format.getInteger("encoder-delay") > THRESHOLD) {
format.setInteger("encoder-delay", 0);
}
NB:这意味着初始间隙不会被消除,但对于没有此类信息的M4a文件,android-9之前的设备上已经存在这种情况