ffmpegc/c++获取帧计数或时间戳和fps
ffmpeg c/c++ get frame count or timestamp and fps
我正在使用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()
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 在多个时间戳处执行函数
- 以天C++为单位的两个时间戳之间的差异
- 获取 QInputEvent 在 Qt 4.8 中被放入 QEventLoop 队列时的时间戳
- 在 C++ 中为文件名添加时间戳
- 如何从远程 SFTP 服务器获取 HH-MM-SS 时间戳格式的文件列表
- 如何将消息时间戳写入日志文件?
- 将时间戳打印到流的最简单方法
- 读取悖论时间戳字段
- C++程序中多个位置的时间 (0) 时间戳
- 在 c++ 中获取 X 毫秒前的时间戳
- 将 unix 时间戳转换为人类可读的日期
- Microsoft NTLM (v2) 中的时间戳使用
- C++中上周一的时间戳
- C++-需要读取存储在文件(.txt)中的时间戳并正确检索
- 使用 C++将时间戳转换为格式化的日期时间
- ffmpegc/c++获取帧计数或时间戳和fps