libavcodec 获取视频时长和帧率

tis*_*shu 5 video duration ffmpeg frame-rate libavcodec

我有一个编码的视频.3gp h.264,我希望在 C 中获得它的帧率和持续时间。这是我在打开文件并找到合适的编解码器后使用的代码:

AVRational rational = gVideoCodecCtx->time_base;

LOGI(10, "numerator is %i", rational.num);
LOGI(10, "denominator is %i", rational.den);
LOGI(10, "duration is %d", gFormatCtx->duration);
LOGI(10, "fps is %d", (double)av_q2d(rational));
Run Code Online (Sandbox Code Playgroud)

这是输出:

12-02 12:30:19.819: I/FFmpegTest(23903): numerator is 1
12-02 12:30:19.819: I/FFmpegTest(23903): denominator is 180000
12-02 12:30:19.819: I/FFmpegTest(23903): duration is 6594490
12-02 12:30:19.819: I/FFmpegTest(23903): fps is 1692926992
Run Code Online (Sandbox Code Playgroud)

从文档中我了解到持续时间是“duration/time_base”,它给了我6594490 / 180000 = 36.6. 我的视频文件的持续时间是6 seconds,我不知道这个因素6来自哪里。

此外,帧率似乎完全关闭。

目前很难找到帮助,因为很多教程使用不推荐使用的方法,并且文档没有给出示例。

任何帮助,将不胜感激。

谢谢

编辑: 感谢下面的评论,我设法打印了以下内容

12-02 18:59:36.279: I/FFmpegTest(435): numerator is 1
12-02 18:59:36.279: I/FFmpegTest(435): denominator is 180000
12-02 18:59:36.279: I/FFmpegTest(435): duration is 6594490
12-02 18:59:36.279: I/FFmpegTest(435): fps is 0.000006
Run Code Online (Sandbox Code Playgroud)

我还设法找出了一个帧的时间戳msec

int msec = 1000*(packet.pts * timeBase * gVideoCodecCtx->ticks_per_frame);
Run Code Online (Sandbox Code Playgroud)

这会返回给我一些粗略的东西33fps(我期望30)。但我不知道如何检索持续时间。文档说“流的持续时间,以AV_TIME_BASE秒为单位”但是6594490 * 0.000006 = 39.5- 正确的持续时间是6.3秒)。另外,确切的FPS是30,但也不知道如何从中获取0.00000630与上述数字)

谢谢

av5*_*501 -2

您的 fps 打印是垃圾,因为它应该是 %lf 而不是 %d。为什么不检查一下其他参数类型呢?