获取视频时长和帧率的libavcodec

5

我有一个用.3gph.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
谢谢
2个回答

1

可以通过以下方式获取FPS:

const double FPS = (double)videoStream->r_frame_rate.num / (double)videoStream->r_frame_rate.den;

其中 videoStream 是:

AVFormatContext * format = NULL;
if ( avformat_open_input( & format, "my_video.mkv", NULL, NULL ) != 0 ) ) on_error();
if ( avformat_find_stream_info( format, NULL ) < 0) on_error();
//av_dump_format( format, 0, "my_video.mkv", false );
AVCodec * video_dec = (AVCodec*)1;
const auto video_stream_index = av_find_best_stream( format, AVMEDIA_TYPE_VIDEO, -1, -1, & video_dec, 0 );
if ( video_stream_index < 0 ) on_error();
const auto videoStream = format->streams[ video_stream_index ];

-2
你的 fps 输出是垃圾,因为它应该是 %lf 而不是 %d。为什么不再检查一次其他参数的类型呢?

1
@Tishu,如果你对文件进行ffprobe或者ffmpeg -i file的操作而没有其他操作,你会得到什么?在控制台上,你将得到FFmpeg认为的帧速率、持续时间等信息。 - av501

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接