Android MediaExtractor无法为有效AAC文件识别轨道问题排查
核心原因分析
MediaExtractor校验逻辑更严苛
Android的MediaExtractor对纯ADTS格式AAC文件的校验标准远高于其他平台(如FFmpeg、iOS)。哪怕文件能在其他平台正常播放,只要存在ADTS帧头参数不匹配(比如帧头采样率索引与实际编码参数不符)、帧长度错误,或是混入非ADTS冗余数据(管道写入残留、跳采样导致的帧断裂),就会直接识别不出有效轨道,返回trackCount=0。管道写入的帧完整性问题
使用ParcelFileDescriptor管道时,若跳采样操作未正确处理帧边界,可能截断单帧AAC数据。虽然AAC每帧有独立头,但MediaExtractor初始化时会扫描开头若干帧确认轨道信息,一旦开头几帧损坏,直接判定无有效轨道。MediaRecorder的ADTS输出兼容性问题
部分Android版本的MediaRecorder输出ADTS格式时,可能存在帧头不标准的情况(比如profile字段错误)。其他平台解码器容错性高,能忽略这类问题,但MediaExtractor会直接过滤掉不符合规范的轨道。
可行解决办法
严格管控ADTS帧完整性
跳采样时必须只跳过完整的AAC帧,禁止截断单帧数据。写入文件前可做简单校验:检查每帧的同步字(0xFFF)是否正确,帧长度字段与实际数据长度是否匹配,杜绝损坏帧写入。换用FFmpeg处理文件(允许引入第三方库时)
FFmpeg对AAC格式的容错性远高于MediaExtractor,即便存在轻微格式问题也能正常识别轨道。可用FFmpeg的avformat_open_input和av_find_stream_info替代MediaExtractor的逻辑。将ADTS封装为MP4容器
纯ADTS裸流无容器结构,MediaExtractor对其支持不稳定。可在录制完成后,把ADTS帧封装成仅含AAC轨道的简单MP4文件,MediaExtractor对MP4容器的支持更可靠。检查录制参数的标准性
确保setAudioSamplingRate和setAudioEncodingBitRate使用标准值(比如采样率44100/48000Hz,比特率64/128kbps)。非标准参数可能导致MediaRecorder输出的ADTS帧头不符合规范,被MediaExtractor拒绝。文件写入完成后做收尾校验
关闭文件前,检查最后一帧是否为完整ADTS帧:读取末尾的ADTS头,验证帧长度与剩余数据长度是否匹配,避免残留不完整数据。
内容的提问来源于stack exchange,提问作者Aishwarya Aishu

