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

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

ss 参数的全称是 set the start time(设置从哪里开始),定义如下:

{"ss", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) }, "set the start time offset", "time_off"},

OPT_INPUTOPT_OUTPUT 两个属性可以知道,ss 参数可以作用于输入文件,也可以作用于输出文件。


ss 参数作用于输入文件

ss 参数用于输入文件的命令如下:

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

上面这条命令的作用是跳转到 juren.mp4 第 10 秒的位置开始处理数据,在 ffmpeg.c 里面的实现流程如下:

1,ss 参数会赋值到 OptionsContextstart_time 字段。这是常规操作了,大部分参数都是解析到 OptionsContext 的某个字段的。

2,start_time 变量经过处理,转换时间单位 之后,会传递给 avformat_seek_file() 函数进行跳转,如下:

1-1

上图还处理了 AVFMT_SEEK_TO_PTS 的情况,可以看到 FFmpeg 里面其实处理了非常多的兼容性问题。对不同的格式都进行了处理,自身项目如果要调 avformat_seek_file 这个函数,最好把上面的 AVFMT_SEEK_TO_PTS 判断也照抄进去项目。


ss 参数作用于输出文件

ss 参数用于输出文件的命令如下:

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

上面这条命令的作用是 裁剪输出文件,把前面的10秒数据丢弃。在 ffmpeg.c 里面的实现流程如下:

1,ss 参数会赋值到 OptionsContextstart_time 字段。常规操作

2,OptionsContext::start_time 会再次赋值到 OutputFIlestart_time,如下:

of->start_time = o->start_time;

of->start_time 又是在哪里被使用的呢?

答:在 configure_output_video_filter()configure_output_audio_filter() 配置滤镜的时候,如下:

1-2

可以看到,插入了 trim 滤镜,裁剪功能就是用 trim 实现的。


总结,当 ss 参数作用于输入文件的时候,是通过 avformat_seek_file() 函数实现的。而当 ss 参数作用于输出文件的时候,是通过 trim 滤镜实现裁剪的功能。


TODO:adjust_frame_pts_to_encoder_tb 函数好像也用到了 of->start_time,后面补充讲解。



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

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

results matching ""

    No results matching ""