这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 5 篇:FFmpeg 裁剪视频。
—— 来自公众号“关键帧Keyframe”的分享
裁剪视频是指从输入中选择想要的矩形区域到输出,不留下任何多余部分。裁剪通常用于调整大小、填充和其他编辑任务。
1、裁剪基础知识
较老的 FFmpeg 版本有 cropbottom、cropleft、cropright 和 croptop 选项,但现在已弃用,取而代之的是下表中描述的裁剪操作。
视频过滤器:裁剪
| 描述 | 将输入视频帧的宽度和高度从 x 和 y 值表示的位置裁剪到指定的宽度和高度;x 和 y 是输出的左上角坐标,坐标系的中心是输入视频帧的左上角。如果使用了可选的 keep_aspect 参数,它将改变输出 SAR(样本宽高比)以补偿新的 DAR(显示宽高比)。 |
|---|---|
| 语法 | crop=ow[:oh[:x[:y[:keep_aspect]]]] |
| ************ | ow 和 oh 参数表达式中可用的变量 |
| x、y | x(从左上角水平方向的像素数)和 y(垂直像素数)的计算值,每个帧都会进行评估。x 的默认值为 (iw – ow)/2,y 的默认值为 (ih – oh)/2。 |
| in_w、iw | 输入宽度 |
| in_h、ih | 输入高度 |
| out_w、ow | 输出(裁剪)宽度,默认值 = iw |
| out_h、oh | 输出(裁剪)高度,默认值 = ih |
| a | 纵横比,与 iw/ih 相同 |
| sar | 输入样本纵横比 |
| dar | 输入显示纵横比,等于表达式 a * sar |
| hsub、vsub | 水平和垂直色度子样本值。对于像素格式 yuv422p,hsub 为 2,vsub 为 1。 |
| n | 输入帧数,从 0 开始 |
| pos | 输入帧文件中的位置,未知则为 NAN |
| t | 以秒为单位的时间戳,输入时间戳未知则无 |
ow 的值可以从 oh 得出,反之亦然,但不能从 x 和 y 得出,因为这些值是在 ow 和 oh 之后确定的。x 的值可以从 y 得出,反之亦然。例如,要获取输入帧的左三分之一、中三分之一和右三分之一,可以使用以下命令:
ffmpeg -i input -vf crop=iw/3:ih:0:0 output
ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
下图是相关参数的示意图:

2、裁剪框中心
当我们想要裁剪框架中心的区域时,作物过滤器的设计可以跳过 x 和 y 参数的输入。x 和 y 的默认值被设置为自动裁剪输入中心的区域。该命令语法对宽度为 w 和高度为 h 的矩形中心区域进行裁剪。
ffmpeg -i input_file -vf crop=w:h output_file
3、自动检测裁剪区域
为了自动检测出裁剪的非黑色区域,我们可以使用 crop 检测过滤器,如下表所示。当输入视频中包含一些黑条时,这种自动裁剪是有用的,通常是在从 4:3 到 16:9 的转换之后,反之亦然。
| 描述 | 检测作物过滤器的作物大小,结果是由参数确定的输入帧的非黑色区域。 |
|---|---|
| 语法 | cropdetect[=limit[:round[:reset]]] 所有参数都是可选的 |
| ************ | 参数描述 |
| limit | 阈值,范围从 0(无)到 255(全部),默认值 = 24 |
limit 参数指定了选择多少深颜色的输出,零值意味着只有完整的黑色被裁剪。例如,要裁剪非黑输出,我们可以使用以下命令:(我这边也没存在黑色边框的视频,测试了几个,没发现有啥用)
ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4
4、时间的裁剪
媒体播放器通常有一个进度条,显示经过的秒数,但大多数只有在鼠标指针停止并在特定持续时间后隐藏时才会显示。 FFmpeg 包含一个包含定时器的 testsrc 视频源,我们可以使用以下命令显示它:
ffplay -f lavfi -i testsrc
testsrc 的默认大小是 320×240 像素,初始计时器的数字 0 有 29×52 像素大小,它在左上角的位置是水平 256 个像素,垂直于 94 像素。要裁剪一个数字的面积,我们可以使用以下命令:
ffmpeg -f lavfi -i testsrc -vf crop=29:52:256:94 -t 10 timer1.mpg
我们想用这个命令来创建一个有 1、2、3 和 4 位数字的定时器,每个数字的筛选器和时间期限的规格都在表中:
| 数的位数 | 数字过滤器规范 | 时长 | 图片 |
|---|---|---|---|
| 1 | crop=29:52:256:94 | 9 秒钟 0 分 : 9 秒 00:00:09 | |
| 2 | crop=61:52:224:94 | 99 秒钟 1 分 : 39 秒 00:01:39 | |
| 3 | crop=93:52:192:94 | 999 秒钟 16 分 : 39 秒 00:16:39 | |
| 4 | crop=125:52:160:94 | 9999 秒钟 2 小时 : 46 分 : 39 秒 02:46:39 |
如果我们想要比 52 像素更高的更大的数字,我们可以用一个 size 参数指定更大的 testsrc 输出(例如:i testsrc=size=vga),然后相应地调整作物区域。

音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。