我正在尝试使用C++中的FFMPEG API将原始H264编码为mp4容器。一切正常,但是AVCC框为空,并返回错误:
[iso文件]框“avcC”大小8无效
如果然后在输出文件上使用命令行工具:
输出文件有效,并且AVCC填充了必需的信息。我不知道为什么该命令行参数有效,但是我无法使用API产生相同的结果。
我在C++代码中所做的事情(也可以在函数调用之间进行操作):
outputFormat_ = av_guess_format( "mp4", NULL, NULL ); //AV_CODEC_H264
formatContext_ = avformat_alloc_context();
formatContext_->oformat = outputFormat_;
...
AVDictionary *opts = NULL;
char tmpstr[50]; sprintf(tmpstr, "%i", muxRate * KILOBYTESTOBYTES);
av_dict_set(&opts, "muxrate", tmpstr, 0);
avformat_write_header( formatContext_, &opts);
av_write_trailer(formatContext_);
除缺少AVCC信息外,此输出是正确的。手动添加(并相应地调整框长)使我可以很好地播放视频。知道为什么API调用未生成AVCC信息吗?
作为引用,这是修复前来自mp4的字符:
之后:
最佳答案
我的MP4文件中的AVCC框为空也有问题。原来,我是在调用CODEC_FLAG_GLOBAL_HEADER
之后在AVCodecContext
实例上设置avcodec_open2
标志的。该标志应在调用avcodec_open2
之前设置。