首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ffmpeg c/c++获取帧数或时间戳和fps

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

Stack Overflow用户
提问于 2012-01-26 14:02:33
回答 1查看 14.6K关注 0票数 7

我正在使用ffmpeg解码C中的一个视频文件,我正在努力获得我正在解码的当前帧的计数或帧的时间戳。我读过许多帖子,展示了如何根据fps和frame时间戳来计算估计的帧no,但是我无法得到这两个。

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

我所拥有的:我可以使用以下命令获取视频的时间

代码语言:javascript
运行
复制
pFormatCtx->duration/AV_TIME_BASE

当我处理它们时,我正在计算当前的帧数,并获得当前的帧数,但从长远来看,这是行不通的。我可以使用下面的命令获取文件的总帧数

代码语言:javascript
运行
复制
pFormatCtx->streams[currentStream->videoStream]->nb_frames

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

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

有没有人知道关于如何获得这个值的例子的资源?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()获取该时间戳

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9014475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档