2012-03-24 3 views
0

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

  1. libx264 + FFmpeg
  2. 30 кадров в секунду (фиксированная)
  3. воспроизведение осуществляется с помощью VLC 2.0.1 и Flowplayer

При воспроизведении FLV кадр скорости кажется ~ 1 кадр в секунду, после так я 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); 

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

  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 кадр/с)?

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

Надав в Sophin

ответ

0

Stepping через код FLV Muxer С отладчик, я нашел реализацию FFMPEG для поддержки МВП разрешением не кроме мс, то есть, имея time_base = (AVRational) {1, 1000}.

Кроме того, должен быть установлен «AVStream :: r_frame_rate», чтобы муфлер flv правильно разрешил частоту кадров.

+0

1/1000 - это ограничение формата FLV. – szatmary