我想编码原始H264到使用C++中的FFMPEG API的mp4容器。这一切工作正常,但是AVCC框为空,并返回错误: [ISO文件]盒“AVCC”大小8无效C++ FFMPEG不写AVCC框信息
如果我再使用对输出文件的命令行工具: 的ffmpeg - 我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 .......................................... YY ... .avcC .... stts
and after: avc1 ............................8.H ... H .......................................... YY ...!avcC.B €(ÿá... gB€(Ú.à.-•...hÎ<€.... stts
我从相机捕获帧时遇到同样的问题,并编码到mp4容器内的h264。你有什么想法如何设置'extradata'? – alijandro 2016-05-17 13:55:44
您的相机数据输出h264?如果是,请查找PPS和SPS块(分别为0x00 0x00 0x00 0x01 0x67和0x00 0x00 0x00 0x01 0x68)。 – awr 2016-05-19 06:01:31
感谢您的回复。这是由ffmpeg新版本API导致的问题,将AVCodecContext中的额外数据复制到AVStream-> codecpar-> extradata可解决此问题。 – alijandro 2016-05-19 11:42:10