识别 Android 上的 HE-AAC 音频以进行正确解码和播放
Identify HE-AAC audio on Android for proper decoding and playback
我在 Android(目标 API 级别 >= 16)上使用 MediaExtractor / MediaCodec
组合来解码音频流。现在,在播放 mp4/m4a 包含 MPEG-4 HE-AAC 音频数据的容器时,我遇到了一个微妙的问题。
当为 MediaFormat.KEY_SAMPLE_RATE
查询音轨的 MediaFormat
时,我实际上只得到预期大小的一半,例如,对于需要 44100 播放采样率的音轨 MediaFormat
returns 22050。在阅读了一些关于 HE-AAC 的文档后,我了解到就该编解码器的工作方式而言,这是 "correct"。
不过,要在 AudioTrack
实例上播放音轨,我必须使用正确的(播放)采样率对其进行配置,即 44100 而不是 22050。
因此,我正在寻找一种方法来确定音频何时使用 API 目标级别 >= 16 进行 HE-AAC 编码,以便我可以设置 AudioTrack
的采样率报告采样率的两倍。
编辑: 当 MediaCodec
return 和 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
时,我会检查 MediaFormat
。格式将如下所示:
max-input-size=946,
aac-profile=2,
mime=audio/mp4a-latm,
durationUs=158499410,
csd-0=java.nio.ByteArrayBuffer[position=0,limit=5,capacity=5],
channel-count=2,
sample-rate=22050
为了在 AudioTrack
上正常播放,我需要将采样率设置为 2 * sample-rate = 44100。
我想知道 csd-0
是否包含更多信息来推断 profile/format/etc。对于上面的示例,csd-0
缓冲区中的 5 个字节如下所示:
0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0
现在想知道这个"codec specific data"
的具体结构
您只应将 MediaExtractor
编辑的 MediaFormat
return 视为提示;您需要查看 MediaCodec
return 和 INFO_OUTPUT_FORMAT_CHANGED
的内容,这应该是 return 真正的采样率。这意味着您只能在内容解码开始后配置 AudioTrack
。
我在 Android(目标 API 级别 >= 16)上使用 MediaExtractor / MediaCodec
组合来解码音频流。现在,在播放 mp4/m4a 包含 MPEG-4 HE-AAC 音频数据的容器时,我遇到了一个微妙的问题。
当为 MediaFormat.KEY_SAMPLE_RATE
查询音轨的 MediaFormat
时,我实际上只得到预期大小的一半,例如,对于需要 44100 播放采样率的音轨 MediaFormat
returns 22050。在阅读了一些关于 HE-AAC 的文档后,我了解到就该编解码器的工作方式而言,这是 "correct"。
不过,要在 AudioTrack
实例上播放音轨,我必须使用正确的(播放)采样率对其进行配置,即 44100 而不是 22050。
因此,我正在寻找一种方法来确定音频何时使用 API 目标级别 >= 16 进行 HE-AAC 编码,以便我可以设置 AudioTrack
的采样率报告采样率的两倍。
编辑: 当 MediaCodec
return 和 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
时,我会检查 MediaFormat
。格式将如下所示:
max-input-size=946,
aac-profile=2,
mime=audio/mp4a-latm,
durationUs=158499410,
csd-0=java.nio.ByteArrayBuffer[position=0,limit=5,capacity=5],
channel-count=2,
sample-rate=22050
为了在 AudioTrack
上正常播放,我需要将采样率设置为 2 * sample-rate = 44100。
我想知道 csd-0
是否包含更多信息来推断 profile/format/etc。对于上面的示例,csd-0
缓冲区中的 5 个字节如下所示:
0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0
现在想知道这个"codec specific data"
的具体结构您只应将 MediaExtractor
编辑的 MediaFormat
return 视为提示;您需要查看 MediaCodec
return 和 INFO_OUTPUT_FORMAT_CHANGED
的内容,这应该是 return 真正的采样率。这意味着您只能在内容解码开始后配置 AudioTrack
。