2013-04-09 133 views
7

我想编码原始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

回答

3

解决了它,需要的数据是AVCC编解码器的SPS和PPS组件。原始H264流为附录b格式,这出现在每个I帧的开始处,在NAL单元中从0x00开始0x00 0x00 0x00 0x01 0x6 7和0x00 0x00 0x00 0x01 0x68。因此,现在需要的是将这些信息复制到AV流编解码器的领域而额外:

codecContext = stream->codec; 

... 

// videoSeqHeader contains the PPS and SPS NAL unit data 
codecContext->extradata = (uint8_t*)malloc(sizeof(uint8_t) * videoSeqHeader_.size()); 

for(unsigned int index = 0; index < videoSeqHeader_.size(); index++) 
{ 
    codecContext->extradata[index] = videoSeqHeader_[index]; 
} 

codecContext->extradata_size = (int)videoSeqHeader_.size(); 

这导致AVCC盒被正确填充。

+0

我从相机捕获帧时遇到同样的问题,并编码到mp4容器内的h264。你有什么想法如何设置'extradata'? – alijandro 2016-05-17 13:55:44

+0

您的相机数据输出h264?如果是,请查找PPS和SPS块(分别为0x00 0x00 0x00 0x01 0x67和0x00 0x00 0x00 0x01 0x68)。 – awr 2016-05-19 06:01:31

+0

感谢您的回复。这是由ffmpeg新版本API导致的问题,将AVCodecContext中的额外数据复制到AVStream-> codecpar-> extradata可解决此问题。 – alijandro 2016-05-19 11:42:10

2

我的空间AVCC框与我的MP4文件也有问题。原来我在之后调用CODEC_FLAG_GLOBAL_HEADER 实例上的标记avcodec_open2。该标志应在之前设置为,呼叫avcodec_open2