我正在使用ffmpeg解码C中的一个视频文件,我正在努力获得我正在解码的当前帧的计数或帧的时间戳。我读过许多帖子,展示了如何根据fps和frame时间戳来计算估计的帧no,但是我无法得到这两个。
我需要:视频文件的fps,当前帧的时间戳或帧编号(未计算)
我所拥有的:我可以使用以下命令获取视频的时间
pFormatCtx->duration/AV_TIME_BASE
当我处理它们时,我正在计算当前的帧数,并获得当前的帧数,但从长远来看,这是行不通的。我可以使用下面的命令获取文件的总帧数
pFormatCtx->streams[currentStream->videoStream]->nb_frames
我读到这可能并不适用于所有的流,尽管它对我尝试过的每一个流都有效。
我已经尝试使用time_base.num和time_base.den值以及packet.pts,但我无法理解从这些值中获得的值,因此我可能只需要更好地了解这些值是什么。
有没有人知道关于如何获得这个值的例子的资源?
发布于 2012-01-26 14:22:12
这个url讨论为什么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流:I P B B
通常,只有当我们正在播放的流中包含B帧时,PTS和DTS才会有所不同。
当我们从av_read_frame()
获得一个包时,它将包含该包内部信息的PTS值和DTS值。但我们真正想要的是新解码的原始帧的PTS,这样我们就知道什么时候显示它。
幸运的是,FFMpeg为我们提供了一个“尽力而为”的时间戳,您可以通过av_frame_get_best_effort_timestamp()
获取该时间戳
https://stackoverflow.com/questions/9014475
复制相似问题