ffmpeg,C ++ - 在程序中获取fps

时间:2013-12-17 15:31:35

标签: c++ ffmpeg

我有一个23.98 fps的视频,这可以从命令行中的Quicktime和ffmpeg看到。错误地认为OpenCV有23 fps。我有兴趣找到一种程序化的方法来从ffmpeg找到一个视频fps。

3 个答案:

答案 0 :(得分:6)

使用FFMPEG-C ++获取每秒视频帧数(fps)

/* find first stream */
for(int i=0; i<pAVFormatContext->nb_streams ;i++ )
{
if( pAVFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) 
/* if video stream found then get the index */
{
  VideoStreamIndx = i;
  break;
}
}


 /* if video stream not availabe */
 if((VideoStreamIndx) == -1)
 {
   std::cout<<"video streams not found"<<std::endl;
   return -1;
 }
 /* get video fps */
 int videoFPS = av_q2d(ptrAVFormatContext->streams[VideoStreamIndx]->r_frame_rate);
 std::cout<<"fps :"<<videoFPS<<std::endl;

答案 1 :(得分:1)

快速浏览一下OpenCV源代码如下:

double CvCapture_FFMPEG::get_fps()
{
    double fps = r2d(ic->streams[video_stream]->r_frame_rate);

#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
    if (fps < eps_zero)
    {
        fps = r2d(ic->streams[video_stream]->avg_frame_rate);
    }
#endif

    if (fps < eps_zero)
    {
        fps = 1.0 / r2d(ic->streams[video_stream]->codec->time_base);
    }

    return fps;
}

所以看起来很正确。也许通过这部分运行调试会话来验证此时的值? AVStreamavg_frame_rateAVRational,因此它应该能够保存精确值。也许如果你的代码使用了第二个if块,因为较旧的ffmpeg版本time_base未设置正确?

修改

如果您进行调试,请查看r_frame_rateavg_frame_rate是否有所不同,因为至少根据this,它们会根据所使用的编解码器而有所不同。由于你还没有提到视频格式,所以很难猜到,但似乎至少在H264中你应该直截了当地使用avg_ frame_rate而从r_frame_rate获得的值可能会搞砸了。

答案 2 :(得分:1)

从2013-03-29发布的libavformat版本55.1.100,添加了av_guess_frame_rate()

/**
 * Guess the frame rate, based on both the container and codec information.
 *
 * @param ctx the format context which the stream is part of
 * @param stream the stream which the frame is part of
 * @param frame the frame for which the frame rate should be determined, may be NULL
 * @return the guessed (valid) frame rate, 0/1 if no idea
 */
AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame);