ffmpeg c / c ++获取帧计数或时间戳和fps

时间:2012-01-26 06:02:33

标签: c++ c ffmpeg

我正在使用ffmpeg来解码C中的视频文件。我正在努力获得我正在解码的当前帧的计数或帧的时间戳。我已经阅读了很多帖子,这些帖子显示了如何根据fps和帧时间戳计算估计的帧数,但是我无法获得其中任何一个。

我需要的是:视频文件的fps,当前帧的时间戳或帧号(未计算)

我拥有的内容:我可以使用

获取视频的时间
pFormatCtx->duration/AV_TIME_BASE

我正在计算当前正在处理它们的帧,并获得当前帧数,但这不会长期工作。我可以使用

获取文件的总帧数
pFormatCtx->streams[currentStream->videoStream]->nb_frames

我已经读过这可能对所有流都不起作用,尽管它对我尝试过的每一个流都有效。

我已经尝试过使用time_base.num和time_base.den值以及packet.pts,但是我无法理解我从这些值中得到的值,所以我可能只需要更好地理解那些值是

是否有人知道有关如何获取此值的示例的资源?

1 个答案:

答案 0 :(得分:6)

这个网址讨论了为什么pts值可能没有意义以及如何获得合理的值: An ffmpeg and SDL Tutorial by Dranger

以下是该链接的专家,它根据帧数和时间戳给出了您正在寻找的具体内容的指导。如果这对您有用,那么您可能需要阅读更多文档以获得更全面的理解:

  

所以让我们说我们有一部电影,画面显示如下:I B B   P.现在,我们需要知道P中的信息才能显示   无论是B帧。因此,帧可能存储如下:   I P B B.这就是为什么我们有解码时间戳和演示文稿   每帧的时间戳。解码时间戳告诉我们何时需要   解码一些东西,演示时间戳告诉我们什么时候   需要展示一些东西。所以,在这种情况下,我们的流可能看起来   像这样:

PTS:    1 4 2 3
DTS:    1 2 3 4
Stream: I P B B
     

通常,PTS和DTS仅在我们的流时才会有所不同   玩有B帧。

     

当我们从av_read_frame()获取数据包时,   它将包含其中信息的PTS和DTS值   包。但我们真正想要的是我们新解码的原始的PTS   框架,所以我们知道何时显示它。

     

幸运的是,FFMpeg为我们提供了“尽力而为”的时间戳   你可以通过,av_frame_get_best_effort_timestamp()