C++ FFMPEG 不写入 AVCC 框信息

标签 c++ video ffmpeg h.264 mp4

我正在尝试使用 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/

相关文章:

video - 如何使用gstreamer同时播放两个视频?

html - 响应式 src 视频代码 shopify

video - 缩小视频大小

image - 如何用静止图像替换视频文件中的视频轨道?

android - 为什么编译器不能从 sp<android::MetaData> 隐式转换为 bool?

C++ 函数无法执行另一个函数并自动结束

c++ - recv() 字符数组大小

c++ - 如何制作适用于 gcc 4.6 的递归 boost::variant?

c++ - Antlr4 在堆上分配 ParseTree

ffmpeg - 如何使用 FFMPEG 连接两个视频(一个没有音频,一个有音频)