仅对视频进行编码FLV

时间:2012-03-24 18:24:35

标签: linux ffmpeg libx264

我正在尝试生成仅限视频的FLV文件,我正在使用:

  1. libx264 + ffmpeg
  2. 30 fps(已修复)
  3. 使用VLC 2.0.1和流程图
  4. 完成播放

    当播放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
    5. 我在这里做错了什么?为什么文件播放不稳定(~1 fps)?

      任何帮助将不胜感激。

      Sophin的Nadav

1 个答案:

答案 0 :(得分:0)

单步执行flv muxer代码使用调试器,我发现ffmpeg实现支持PTS的分辨率,而不是msec,即具有time_base =(AVRational){1,1000}。

此外,必须设置'AVStream :: r_frame_rate'才能使flv复用器正确解析帧速率。