我正在使用ffmpeg来解码C中的视频文件。我正在努力获得我正在解码的当前帧的计数或帧的时间戳。我已经阅读了很多帖子,这些帖子显示了如何根据fps和帧时间戳计算估计的帧数,但是我无法获得其中任何一个。
我需要的是:视频文件的fps,当前帧的时间戳或帧号(未计算)
我拥有的内容:我可以使用
获取视频的时间pFormatCtx->duration/AV_TIME_BASE
我正在计算当前正在处理它们的帧,并获得当前帧数,但这不会长期工作。我可以使用
获取文件的总帧数pFormatCtx->streams[currentStream->videoStream]->nb_frames
我已经读过这可能对所有流都不起作用,尽管它对我尝试过的每一个流都有效。
我已经尝试过使用time_base.num和time_base.den值以及packet.pts,但是我无法理解我从这些值中得到的值,所以我可能只需要更好地理解那些值是
是否有人知道有关如何获取此值的示例的资源?
答案 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()