我正在尝试使用 C++ 中的 FFMPEG API 将原始 H264 编码到 mp4 容器中。一切正常,但是 AVCC 框为空,并返回错误:[iso file] Box "avcC" size 8 invalid
如果我在输出文件上使用命令行工具:
ffmpeg -i output.mp4 -vcodec 复制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