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

bro*_*chb 7 c c++ ffmpeg

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

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

我拥有:我能够获得视频的使用时间

pFormatCtx->duration/AV_TIME_BASE
Run Code Online (Sandbox Code Playgroud)

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

pFormatCtx->streams[currentStream->videoStream]->nb_frames
Run Code Online (Sandbox Code Playgroud)

我已经读过这可能不适用于所有流,虽然它已经适用于我尝试过的每一个流.

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

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

Bee*_*eel 7

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

以下是该链接的专家,该框架提供了有关您正在寻找的帧数和时间戳的指导.如果这对您有用,那么您可能需要阅读更多文档以获得更全面的理解:

所以我们假设我们有一部电影,框架显示如下:IBB P.现在,我们需要知道P中的信息才能显示B帧.因此,帧可能存储如下:IPB B.这就是我们在每个帧上都有解码时间戳和显示时间戳的原因.解码时间戳告诉我们何时需要解码某些内容,并且演示时间戳告诉我们何时需要显示某些内容.因此,在这种情况下,我们的流可能如下所示:

PTS:    1 4 2 3
DTS:    1 2 3 4
Stream: I P B B
Run Code Online (Sandbox Code Playgroud)

一般来说,PTS和DTS只有在我们正在播放的流中有B帧时才会有所不同.

当我们从av_read_frame()获取数据包时,它将包含该数据包内信息的PTS和DTS值.但我们真正想要的是我们新解码的原始帧的PTS,因此我们知道何时显示它.

幸运的是,FFMpeg为我们提供了"尽力而为"的时间戳,您可以通过它获取,av_frame_get_best_effort_timestamp()