我有一个用.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是指“duration/time_base”,这给了我6594490 / 180000 = 36.6
。我的视频文件持续时间为6秒
,我不知道这个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
秒). 而且确切的帧率是 30
,但不确定如何从上述数据中的0.000006
得到30
。谢谢