Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ FFMPEG not writing AVCC box information

I'm trying to encode raw H264 into an mp4 container using the FFMPEG API in C++. It all works fine, however the AVCC box is empty, and it returns the error: [iso file] Box "avcC" size 8 invalid

If I then use the command line tool on the output file:

ffmpeg -i output.mp4 -vcodec copy fixed.mp4

The output file works and AVCC is populated with the required information. I'm at a loss as to why this command line argument works but I'm unable to produce the same result using the API.

What I do in the C++ code (also do things in between the function calls):

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_);

The output of this is correct, except it's missing the AVCC information. Adding this is manually (and fixing the box lengths accordingly) lets me playback the video fine. Any idea why the API calls are not generating the AVCC info?

For reference, here's the chars from the mp4 before the fix:

.avc1.........................€.8.H...H..........................................ÿÿ....avcC....stts

and after:

avc1.........................€.8.H...H..........................................ÿÿ...!avcC.B€(ÿá..gB€(Ú.à.—•...hÎ<€....stts

like image 775
awr Avatar asked Apr 09 '13 09:04

awr


1 Answers

I had the problem with empty AVCC boxes with my MP4 files too. It turned out I was setting CODEC_FLAG_GLOBAL_HEADER flag on the AVCodecContext instance after calling avcodec_open2. The flag should be set before calling avcodec_open2.

like image 116
Ali Alidoust Avatar answered Sep 29 '22 16:09

Ali Alidoust