Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set the moov atom position when encoding video using ffmpeg in c++

I'm encoding some h264 video into a mp4 container using ffmpeg in c++. But the result videos place the moov atom(or metadata?) at the end of the video file, it's bad for internet streaming. So how can I set the moov atom position to the front?

like image 767
Zhiqiang Li Avatar asked Feb 27 '15 08:02

Zhiqiang Li


2 Answers

MOVMuxContext is an internal header and should not be accessed directly. Its implementation is not part of the API and it can change. The official way to do it is setting options via an AVDictionary :

AVDictionary* options = nullptr;
av_dict_set( &options, "movflags", "faststart", 0 );
avio_open2(..., &options);
like image 156
Calvin1602 Avatar answered Sep 19 '22 02:09

Calvin1602


You need to use faststart flag of ffmpeg to place the moov atom in the beginning of the MP4 file, Here is the explanation of the flag. Programatically you need to set the flag in output context, here is the sample code and its working for me,

AVFormatContext *outFormatCtx;

// Write MOOV atom at the begining of the MP4 file
MOVMuxContext *mov = NULL;

mov = (MOVMuxContext *)outFormatCtx->priv_data;
mov->flags |= FF_MOV_FLAG_FASTSTART;
like image 42
pragnesh Avatar answered Sep 20 '22 02:09

pragnesh