我有一个视频编码,.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));
这是输出:
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
从文档中,我了解到持续时间是“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
我还设法找到了一个帧的时间戳msec
:
int msec = 1000*(packet.pts * timeBase * gVideoCodecCtx->ticks_per_frame);
这返回给我的东西大概是33fps
(我期望的30
)。但我不知道如何检索持续时间。文档说“流的持续时间,以AV_TIME_BASE
小数秒为单位”但是6594490 * 0.000006 = 39.5
- 正确的持续时间是6.3
秒)。确切的 fps 也是30
,但不确定如何从0.000006
上述30
数字中得到)
谢谢