Кодирование видео только FLV - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь создать видео только FLV-файл, я использую:

  1. libx264 + ffmpeg
  2. 30 кадров в секунду (фиксированный)
  3. воспроизведение выполняется с использованием VLC 2.0.1 и flowplayer

При воспроизведении FLV частота кадров составляет ~ 1 кадр в секунду, вот как я могу это сделать:

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

Полученный файл выглядит нормально, за исключением частоты кадров воспроизведения .
имея в виду, что:

  1. pOutVideoStream-> avg_frame_rate = (AVRational) {30, 1};
  2. pOutVideoStream-> time_base = (AVRational) {1, 30000};
  3. pOutVideoStream-> codec-> time_base = (AVRational) {1, 30000};
  4. Для каждого кадра я увеличиваю dts / pts на 1000

Что я здесь не так делаю? почему файл воспроизводится прерывисто (~ 1 кадр / с)?

Любая помощь будет оценена.

Надав у Софина

1 Ответ

0 голосов
/ 25 марта 2012

Переход по коду flv muxer С помощью отладчика я обнаружил, что реализация ffmpeg поддерживает PTS с разрешением, отличным от msec, то есть с time_base = (AVRational) {1, 1000}.
Кроме того, AVStream :: r_frame_rate 'должен быть установлен для того, чтобы flv muxer правильно разрешал частоту кадров.

...