写在前面
如果您对音视频技术感兴趣,可以订阅我的专题:音视频专辑
也可以关注我的账户: 张芳涛,我后期会发布更多的音视频以及图像处理方面的文章。
正文
裁剪视频意味着从输入到输出中选择想要的矩形区域而没有余数。 裁剪通常用于调整大小,填充和其他编辑。
裁剪基础知识
较老的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
原视频这样:(就当给人家打广告了)
经过如下的测试指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:0:0 /Users/zhangfangtao/Desktop/newTest.mp4
让我重新编码之后长这样:(惊不惊喜?意不意外)
再用下面的测试指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:iw/3:0 /Users/zhangfangtao/Desktop/newTest.mp4
生成的视频如下图:
使用如下指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/3:ih:iw/3*2:0 /Users/zhangfangtao/Desktop/newTest.mp4
生成的视频如下图:(最右边的三分之一)
下图是相关参数的示意图:
裁剪框中心
当我们想要裁剪框架中心的区域时,作物过滤器的设计可以跳过x和y参数的输入。x和y的默认值是。
这意味着默认值被设置为自动裁剪输入中心的区域。该命令语法对w宽度和h高度的矩形中心区域进行裁剪。
ffmpeg -i input_file -vf crop=w:h output_file
我做了一个100*100的裁剪,指令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=100:100 /Users/zhangfangtao/Desktop/newTest.mp4
输出的视频长这样:
为了裁剪中间的半帧,我们可以使用以下命令:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
我的测试指令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf crop=iw/2:ih/2 /Users/zhangfangtao/Desktop/newTest.mp4
裁剪之后的视频:
自动检测裁剪区域
为了自动检测出裁剪的非黑色区域,我们可以使用crop检测过滤器,如下表所示。当输入视频中包含一些黑条时,这种自动裁剪是有用的,通常是在从第4:3到16:9的转换之后,反之亦然。
描述 | 检测作物过滤器的作物大小,结果是由参数确定的输入帧的非黑色区域 |
---|---|
语法 | cropdetect[=limit[:round[:reset]]] all parameters are optional |
************ | 参数的描述 |
limit | 阈值,从0(无)到255 (all),默认值= 24 |
round | -即使是整数,宽度和高度也必须是可分割的 - 4:2 2视频需要一个2的值,它只给出了维度 -偏移量自动更改为中心帧 -默认值为16,它是许多编解码器的最佳值 |
reset | 计数器决定了多少帧crop探测将重置之前检测到的最大视频区域并重新开始检测当前最优的作物区域。默认值为0。当通道标识扭曲了视频区域时,这是很有用的。0表示永远不会重置和返回在回放期间遇到的最大区域 |
limit参数指定了选择了多少深颜色的输出,零值意味着只有完整的黑色被裁剪。例如,要裁剪非黑输出,我们可以使用以下命令:(我这边也没存在黑色边框的视频,测试了几个,没发现有啥用)
ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4
时间的裁剪
媒体播放器通常有一个进度条,显示经过的秒数,但大多数只有在鼠标指针停止并在特定持续时间后隐藏时才会显示。 FFmpeg包含一个包含定时器的testsrc视频源,我们可以使用以下命令显示它:
这里面大家可能会遇到一个问题,你编译出来的ffmpeg里面可能没有ffplay,我是遇到过这个问题,网上找了很多方案,也没啥用,最后来了一个简单直接的。。。。编译FFmpeg之后没有ffplay?方法在这儿
ffplay -f lavfi -i testsrc
我在自己电脑上测试的,指令和上面的一样,显示的效果如下图所示:
testsrc的默认大小是320x240像素,初始计时器的数字0有29x52像素大小,它在左上角的位置是256个像素,垂直于94像素。要裁剪一个数字的面积,我们可以使用以下命令:
ffmpeg -f lavfi -i testsrc -vf crop=29:52:256:94 -t 10 timer1.mpg
我在自己的电脑上测试了一下,显示的效果如下图(一个10秒钟,20K的小视频):
我们想用这个命令来创建一个有1、2、3和4位数字的定时器,每个数字的筛选器和时间期限的规格都在表中:
数的位数 | 数字过滤器规范 | 时长 | 图片 |
---|---|---|---|
1 | crop=29:52:256:94 | 9 seconds 0 min : 9 sec 00:00:09 |
|
2 | crop=61:52:224:94 | 99 seconds 1 min : 39 sec 00:01:39 |
|
3 | crop=93:52:192:94 | 999 seconds 16 min : 39 sec 00:16:39 |
|
4 | crop=125:52:160:94 | 9999 seconds 2 hours : 46 min : 39 sec 02:46:39 |
给大家示范一下下面的指令:
ffmpeg -f lavfi -i testsrc -vf crop=125:52:160:94 -t 50 timer.mp4
显示的效果如下:
如果我们想要比52像素高的更大的数字,我们可以用一个size参数指定更大的testsrc输出(例如:i testsrc=size=vga),然后相应地调整作物区域。上面的那个完整的指令如下:(我自己试了一下,视频有了,没有文字。。。)
ffmpeg -f lavfi -i testsrc=size=vga -vf crop=125:52:160:94 -t 50 timer.mp4
为了改变数字和背景的颜色,我们可以使用一个lut过滤器,这是在颜色修正的章节中描述的。创建的计时器将用于视频覆盖的示例。