FFmpeg命令行参数分析-vframes—ffmpeg.c源码分析

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

vframes 参数的全称是 video frame,作用是限制输出源的视频帧数量,用法如下:

ffmpeg -i juren.mp4 -an -vframes 10 juren.flv

上面的命令只提取了 10帧视频保存到 flv 里面。

vframes 参数定义如下:

1-1

上图中,vframes 参数有OPT_VIDEOOPT_OUTPUT 两个属性,所以它是作用于输出的参数,只对视频生效。

定义中,会调 opt_video_frames() 函数来解析 vframes 参数,如下:

static int opt_video_frames(void *optctx, const char *opt, const char *arg)
{
    OptionsContext *o = optctx;
    return parse_option(o, "frames:v", arg, options);
}

opt_video_frames() 里面,把 vframes 换成了 frames:v,所以实际上解析的是 frames:v,这种带冒号 : 的解析方法之前在 《FFmpeg命令参数分析-b:v》讲过了,只会匹配冒号前面的部分,所以真正的定义是 frames,如下:

1-2


首先,vframes 参数会赋值给 OptionsContext 结构的 max_frames 字段。

然后 OptionsContext::max_frames 会赋值给 ost->max_frames ,如下:

1-3

那 ost->max_frames 会在那些地方被使用呢?

1,do_video_out 函数

在《do_video_out视频编码封装》一文简单讲解过 do_video_out 函数的逻辑。

1-4

2,need_output 函数

need_output() 函数里面,当达到最大的视频帧数的时候,就会把 视频流关联的输入文件里面的所有流都关闭,包括音频流,注意下图中的 for 循环。

1-5


至此,vframes 的实现原理就介绍完毕了,不过 vframes 有另一种用法,可以实现任意时间抽帧,命令如下:

ffmpeg -i juren.mp4 -ss 00:00:05.000 -vframes 1 out.png

上面这条命令用了 -ss 跳转到第 5 秒的位置,然后只输出一帧保存成 png,就立即退出了。



感谢 NETINT(镕铭微电子) 赞助《FFmpeg原理》免费版一书的服务器费用,下面是 VPU 产品介绍

版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2023-07-26 11:33:10

results matching ""

    No results matching ""