ffmpeg解码mp3报错Header missing和Invalid data found when processing input
摘要:本文记录了一个MP3文件解码错误的解决过程。分析发现报错是由于音频帧头解析失败导致,通过FFmpeg转码测试发现WAV可成功转换而MP3失败。深入源码定位问题源于ADTS帧头格式不符,其中WAV转换成功是因为默认忽略错误帧继续解码,而MP3失败则因不支持封面图片的JPEG格式(SOF7)。最终确认错误机制为帧头校验失败向上返回AVERROR_INVALIDDATA导致。
问题
在一次音频解码中发现一个mp3文件报了解码错误(Header missing和Invalid data found when processing input)
解决
从报错来看,应该是音频流某一帧解码缺少了什么头导致的错误。我针对这个mp3文件,使用命令行分别尝试了转码wav和mp3,得到下面两个结果。

第一个截图转wav,第二个截图转mp3。结果都报了错误,其中第一个成功转码了得到了wav文件,同时正常播放;第二个则是直接转码失败。
解决还是看ffmpeg源码,搜索Header missing就可以知道在mpegaudiodec_template.c中,解码读取avpkt->data做头解析的时候错误了,也就是这一帧出了问题。
为了验证是不是这个问题,我断点会报错的avcodec_send_packet调用,二进制查看av_packet->data

但要知道这个aac帧头是不是有问题,还需要知道ffmpeg是怎么解析这个头的(了解aac编码的就可以直接判断了)。所以还是看源码adts_header.c(aac的adts头格式解码,adts和raw格式这里就不做说明了),可以发现adts会使用0xfff做帧同步,而问题帧显然不是,因此解码自然就报错了。
额外探讨
到这里报错的原因已经找到,这里额外做几个探讨
Invalid data found when processing input哪来的
看ffmpeg命令行解码逻辑就知道,send packet里面会调用avpriv_mpegaudio_decode_header,而这里头解析错误就会向上返回AVERROR_INVALIDDATA,通过av_err2str输出Invalid data found when processing input。
为什么wav转码成功了,mp3转码失败了
先说wav,因为解码错误时候ffmpeg命令行默认exit_on_error=false(通过-xerror 设置),也就是会丢弃这个packet继续解码,只不过少了这个问题帧。
而mp3转码错误还是因为mjpeg: unsupported coding type (c7)这个问题,也就是ffmpeg不支持c7这种格式的jpeg(也就是SOF7),而这个mp3视频的封面恰好是这个格式,所以导致后续的失败。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)