我正在尝试使用 C++ 中的 FFMPEG API 将原始 H264 编码为 mp4 容器。一切正常,但 AVCC 框为空,并返回错误: [iso 文件] 框“avcC”大小 8 无效
如果我然后在输出文件上使用命令行工具:
ffmpeg -i output.mp4 -vcodec copy fixed.mp4
输出文件有效,并且 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 中的字符:
.avc1.........................€.8.H...H..........................................ÿÿ....avcC....stts
及之后:
avc1.........................€.8.H...H..........................................ÿÿ...!avcC.B€(ÿá..gB€(Ú.à.—•...hÎ<€....stts
最佳答案
我的 MP4 文件也有空 AVCC 框的问题。事实证明,我在调用 avcodec_open2
之后 在 AVCodecContext
实例上设置了 CODEC_FLAG_GLOBAL_HEADER
标志。应在调用 avcodec_open2
之前设置标志。
关于C++ FFMPEG 不写入 AVCC 框信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15897849/