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

ffmpeg c/c++ get frame count or timestamp and fps

本文关键字:时间戳 fps c++ 获取 ffmpegc      更新时间:2023-10-16

我正在使用ffmpeg解码C中的视频文件。我很难获得我正在解码的当前帧的计数或帧的时间戳。我读过很多帖子,展示了如何根据fps和帧时间戳计算估计的帧号,但我都无法获得。

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

我所拥有的:我可以使用获得视频的时间

pFormatCtx->duration/AV_TIME_BASE

我目前正在处理帧,并得到当前的帧计数,但这不会长期有效。我可以使用获得文件的总帧数

pFormatCtx->streams[currentStream->videoStream]->nb_frames

我读过这可能不适用于所有流,尽管它适用于我尝试过的每一个流。

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

有人知道哪些资源展示了如何获得这些价值的例子吗?

此url讨论了pts值可能没有意义的原因以及如何获得合理的值:Dranger 的ffmpeg和SDL教程

以下是该链接的摘录,从帧数和时间戳的角度为您提供了确切的指导。如果这对你来说很有用,那么你可能想阅读更多的文档以获得更全面的理解:

假设我们有一部电影,画面显示为:I B BP。现在,我们需要知道P中的信息,然后才能显示或者B帧。因此,帧的存储方式可能如下:这就是为什么我们有一个解码时间戳和一个演示每个帧上的时间戳。解码时间戳告诉我们何时需要解码某个内容,并且演示时间戳告诉我们何时需要展示一些东西。因此,在这种情况下,我们的流可能看起来像这样:

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

一般来说,PTS和DTS只会在我们所在的流播放中有B帧。

当我们从CCD_ 1获得分组时,它将包含内部信息的PTS和DTS值小包裹但我们真正想要的是我们新解码的原始数据的PTS帧,这样我们就知道何时显示。

幸运的是,FFMpeg为我们提供了一个";尽最大努力";时间戳你可以通过av_frame_get_best_effort_timestamp()