You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中MediaCodec转AAC失败:垃圾音频与播放异常排查求助

音频转AAC格式异常排查关键点

核心问题定位:时间戳不匹配

你遇到的AudioSink$UnexpectedDiscontinuityException是直接诱因,本质是编码输出的音频帧时间戳存在跳变或时间基不匹配,导致ExoPlayer无法正常同步播放。

必查的关键环节

1. 时间戳同步与转换

  • 不管是直接编码还是解码重编码,必须完成时间基转换:MediaExtractor读取的时间戳基于源文件的时间基(比如1/44100秒),编码时要转换为目标AAC的标准时间基(1/1000000秒,即微秒)。
  • 解码重编码场景下,原始PCM帧的时间戳需按采样数计算增量:时间增量 = 帧采样数 * 1000000 / 目标采样率(32000),不能直接复用解码后的时间戳或随意赋值。

2. 编码参数严格对齐目标规格

配置MediaCodec时必须显式指定以下参数,禁止依赖默认值:

  • KEY_BIT_RATE: 128000(精确对应128kbps)
  • KEY_SAMPLE_RATE: 32000
  • KEY_CHANNEL_COUNT: 与源音频声道数一致,或明确指定转码后的声道数(如单声道/立体声),多声道源需做好声道映射,否则会出现杂音
  • KEY_AAC_PROFILE: 使用AACObjectLC(低复杂度profile,兼容性最优)
  • 解码重编码场景注意:解码出的PCM格式(采样率、声道数、位深)必须与编码器输入格式完全匹配,若源是44100Hz等其他采样率,需先重采样到32000Hz再喂给编码器。

3. MediaCodec与MediaMuxer状态流转

  • 严格遵循MediaCodec状态流程:configure() -> start() -> 循环处理输入/输出缓冲区,输入缓冲区耗尽时需等待,输出缓冲区需及时处理,避免积压。
  • MediaMuxer添加轨道时,必须使用编码器输出的MediaFormat,禁止自行构造格式(编码器可能会调整实际参数);同时确保BUFFER_FLAG_CODEC_CONFIG标记的配置帧(如AAC的ADTS头)被优先写入,否则播放器无法解析文件结构。

4. 原始PCM数据完整性(解码重编码场景)

  • 解码得到的PCM数据需保证帧完整性,不能拆分或合并帧;注意字节序(通常为小端)和位深(如16位),喂给编码器时不能出现数据截断或填充错误。

5. Codec2警告关联排查

Codec2Client: query -- param skipped警告通常是编码器私有参数查询不被支持,本身不直接导致音频损坏,但可能是编码器未正确初始化的信号。建议指定使用OMX.google.aac.encoder编码器,避免厂商私有编码器的兼容性问题。

验证建议

  • 先用简单源文件测试(如32000Hz单声道PCM文件),验证编码流程正确性后再兼容复杂源格式。
  • 使用ffprobe output.aac命令检查输出文件的格式参数,若ffprobe无法解析,说明文件结构已损坏。

内容的提问来源于stack exchange,提问作者Vidit Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:22