Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 9 AAC解码器使用ffmpeg编码文件输出零样本_Android_Android Mediacodec_Aac_Android 9.0 Pie_Mediaextractor - Fatal编程技术网

Android 9 AAC解码器使用ffmpeg编码文件输出零样本

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 将其放入编解码器 从编解码器中取出输出缓冲区 问题是,当最后一个可

我有一些自动测试,尝试使用Android的
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之前的设备上已经存在这种情况