Question

I am trying to generate a video only FLV file, I am using:

  1. libx264 + ffmpeg
  2. 30 fps ( fixed )
  3. playback is done using VLC 2.0.1 and flowplayer

When playing the FLV the frame-rate seems ~1 frame per sec, following is the way I cfg ffmpeg:

AVOutputFormat* fmtOutput = av_oformat_next(0);
while((0 != fmtOutput) && (0 != strcmp(fmtOutput->name, "flv")))
    fmtOutput = av_oformat_next(fmtOutput);
m_pFmtCtxOutput          = avformat_alloc_context();
m_pFmtCtxOutput->oformat = fmtOutput;

AVStream* pOutVideoStream= av_new_stream(m_pFmtCtxOutput, pInVideoStream->id);
AVCodec*  videoEncoder   = avcodec_find_encoder(CODEC_ID_H264);

pOutVideoStream->codec->width    = 640;
pOutVideoStream->codec->height   = 480;
pOutVideoStream->codec->level    = 30;
pOutVideoStream->codec->pix_fmt  = PIX_FMT_YUV420P;
pOutVideoStream->codec->bit_rate = 3000000;

pOutVideoStream->cur_dts         = 0;
pOutVideoStream->first_dts       = 0;
pOutVideoStream->index           = 0;
pOutVideoStream->avg_frame_rate  = (AVRational){ 30, 1 };
pOutVideoStream->time_base       =
pOutVideoStream->codec->time_base= (AVRational){ 1, 30000 };
pOutVideoStream->codec->gop_size = 30;
%% Some specific libx264 settings %%
m_dVideoStep                     = 1000;// packet dts/pts is incremented by this amount each frame

pOutVideoStream->codec->flags   |= CODEC_FLAG_GLOBAL_HEADER;
avcodec_open(pOutVideoStream->codec, videoEncoder);

The resulting file seems OK, with the exception of the playback frame-rate.
having in mind that:

  1. pOutVideoStream->avg_frame_rate = (AVRational){ 30, 1 };
  2. pOutVideoStream->time_base = (AVRational){ 1, 30000 };
  3. pOutVideoStream->codec->time_base= (AVRational){ 1, 30000 };
  4. For each frame I increment the dts/pts by 1000

What am I doing wrong here? why the file is playing choppy ( ~1 fps )?

Any help will be appreciated.

Nadav at Sophin

Was it helpful?

Solution

Stepping through the flv muxer code With a debugger, I have found the ffmpeg implementation to support PTS of a resolution no other than msec, that is, having time_base = (AVRational){ 1, 1000 }.

Also, 'AVStream::r_frame_rate' must be set in order for the flv muxer to properly resolve the frame-rate.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top