FFmpeg转mp4为flv时报avc1标签与编解码器id27不兼容如何解决
问题解答
1. 报错含义
这个报错的核心是输出格式标签不匹配:你从MP4源文件复制的H264编码对应的FourCC标签是avc1,但FLV封装格式规定H264编码必须使用标签H264(报错中[7][0][0][0]是H264四个字符的小端存储字节值,对应codec id 27也就是AV_CODEC_ID_H264),两者不符导致FLV封装器校验不通过,写文件头失败。
2. 对应标签的定义位置
相关标签定义在FFmpeg源码的两个位置:
libavformat/flv.h:定义了FLV格式支持的所有编码编码规则libavformat/flvenc.c:实现了FLV封装器的参数校验逻辑,其中明确规定H264对应的合法编码编码为AV_RL32("H264")
你用的avc1是MP4/MOV封装格式下H264的专属标签,定义在libavformat/isom.h中。
3. 直接复制源流参数不满足FLV封装要求的原因
不同封装格式对编码的标识、元数据格式、附加数据格式都有自己的编码规范,你直接复制MP4源的流参数没有做适配,就会触发不兼容:
- 标签规范差异:MP4用
avc1标识H264编码,FLV要求用H264标识H264编码,直接复制过来的标签不符合FLV的校验规则 - 其他隐含差异:除了标签之外,不同封装对H264的附加数据(extradata)格式也有细微要求,比如有些封装用annexb格式,有些用avcc格式,虽然FLV兼容MP4的avcc格式extradata,但标签不对的话封装器直接就会拒绝处理。
修复方案
你只需要在复制完源流参数之后,加一行代码让FFmpeg自动匹配输出格式对应的正确编码标签即可:
// 复制源流参数之后添加 out_stream->codecpar->codec_tag = av_codec_get_tag(fmt_ctx->oformat->codec_tag, out_stream->codecpar->codec_id);
这行代码会根据你选择的输出格式(这里是FLV),自动查询对应编码ID对应的合法编码标签,覆盖掉从源文件复制过来的不兼容标签,之后再调用avformat_write_header就不会报错了。
内容的提问来源于stack exchange,提问作者Inez A
相关产品推荐
相关产品推荐

