我有一个用.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
由于
答案 0 :(得分:0)
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 ];
答案 1 :(得分:-1)
你的fps打印是垃圾,因为它应该是%lf而不是%d。 为什么不一次检查其他参数类型。