10、视频裁剪与缩放:使用crop和scale滤镜裁剪视频区域、调整分辨率

视频处理中,裁剪和缩放是最常用的两个操作。说白了,一个是从画面里切出一块区域,另一个是把整幅画面放大或缩小。我做了这么多年音视频,这两个滤镜几乎每天都在用。今天咱们就好好聊聊FFmpeg里的cropscale滤镜。

10.1 crop滤镜:从画面中切出你想要的区域

crop滤镜的作用是从原始视频中裁剪出一个矩形区域。它的基本语法是:

crop=out_w:out_h:x:y
  • out_w:输出宽度
  • out_h:输出高度
  • x:裁剪区域左上角的X坐标
  • y:裁剪区域左上角的Y坐标

举个最简单的例子。假设你有一段1920x1080的视频,你想把画面正中间的一块1280x720的区域切出来:

ffmpeg -i input.mp4 -vf "crop=1280:720:(1920-1280)/2:(1080-720)/2" output.mp4

这里我用了表达式来计算居中位置。其实FFmpeg支持更简洁的写法:

ffmpeg -i input.mp4 -vf "crop=1280:720" output.mp4

嗯,你没看错。如果不指定x和y,默认就是居中裁剪。我个人习惯在脚本里还是把坐标写清楚,这样别人看代码时一目了然。

小技巧:crop滤镜支持使用变量。比如 crop=iw/2:ih/2 表示裁剪出画面左上角的四分之一区域。iw和ih分别代表输入宽度和输入高度。

10.2 动态裁剪:让裁剪区域动起来

crop滤镜还有一个很酷的功能——支持时间变量。你可以让裁剪区域随着时间移动。比如做一个“扫描”效果:

ffmpeg -i input.mp4 -vf "crop=iw/2:ih/2:t*10:0" output.mp4

这里的t代表当前时间(秒),乘以10就是每秒钟移动10个像素。我在项目中做过一个视频会议系统,需要根据发言人位置动态裁剪画面,用的就是这种思路。

注意:动态裁剪时,x和y的值不能超出画面边界。我曾经踩过这个坑,裁剪区域跑到画面外面去了,结果输出视频出现黑边。建议加上 min() 函数做边界保护。

10.3 scale滤镜:调整视频分辨率

scale滤镜用于改变视频的尺寸。基本语法:

scale=width:height

比如把1080p的视频缩放到720p:

ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4

实际工作中,我们经常需要保持宽高比。FFmpeg提供了两种方式:

  • 指定一个维度,另一个用 -1 自动计算
  • 使用 force_original_aspect_ratio 参数

举个例子:

# 宽度固定为720,高度按比例自动计算
ffmpeg -i input.mp4 -vf "scale=720:-1" output.mp4

# 或者用更精确的方式
ffmpeg -i input.mp4 -vf "scale=720:480:force_original_aspect_ratio=decrease" output.mp4

force_original_aspect_ratio=decrease 的意思是:在不超过指定尺寸的前提下,尽量保持原始宽高比。如果原始视频是16:9,指定720x480,它会缩放到720x405,然后上下加黑边。

核心要点:scale滤镜默认使用双线性插值算法。如果你追求画质,可以指定 flags=lanczos 使用Lanczos算法,虽然慢一点,但缩放效果更好。

10.4 缩放算法选择:画质与性能的权衡

FFmpeg的scale滤镜支持多种缩放算法。我整理了一个表格,方便你对比:

算法名称 质量 速度 适用场景
bilinear 一般 实时预览、低功耗设备
bicubic 较好 中等 日常转码
lanczos 优秀 高质量输出、缩图
spline 优秀 较慢 专业影视后期
area 中等 缩小视频(抗锯齿)

我个人推荐:缩小视频用 area 算法,放大视频用 lanczos。为什么?缩小用area可以避免摩尔纹,放大用lanczos能保留更多细节。这是我在处理一批监控录像时总结出来的经验。

10.5 裁剪+缩放组合使用

实际项目中,裁剪和缩放经常一起用。比如你想从4K视频中截取人脸区域,然后放大到1080p:

ffmpeg -i input.mp4 -vf "crop=400:400:1000:500,scale=1920:1080" output.mp4

滤镜链的顺序很重要。先裁剪再缩放,和先缩放再裁剪,结果完全不同。你想想看:先裁剪只处理小区域,计算量小;先缩放要处理整幅画面,计算量大。所以一般建议先裁剪后缩放。

性能优化:如果只是做裁剪,不需要缩放,可以用 -ss-t 先截取时间段,再用crop滤镜,能省不少时间。

10.6 知识体系总览

下面这张图总结了本章的核心内容,帮你理清思路:

视频裁剪与缩放知识体系 crop 裁剪滤镜 scale 缩放滤镜 基本语法:crop=w:h:x:y 居中裁剪:省略x:y参数 动态裁剪:使用t变量 变量支持:iw, ih, t等 基本语法:scale=w:h 保持宽高比:-1自动计算 缩放算法:bilinear/lanczos等 force_original_aspect_ratio 组合使用:crop + scale 滤镜链

10.7 实战:制作视频缩略图

最后分享一个我在项目中常用的技巧——用crop和scale生成视频缩略图。比如从视频第10秒截取一帧,裁剪出中心区域,再缩放到320x180:

ffmpeg -i input.mp4 -ss 10 -vframes 1 -vf "crop=iw/2:ih/2,scale=320:180" thumbnail.jpg

这个命令在视频网站的后台处理中很常见。我曾经给一个短视频平台做过缩略图生成服务,每天要处理上百万个视频,用的就是类似的命令。关键是要控制好裁剪区域和缩放比例,保证缩略图能准确反映视频内容。

总结一下:crop负责“切”,scale负责“缩”。两者配合,可以应对绝大多数视频尺寸调整的需求。记住先裁剪后缩放的原则,选对缩放算法,你的视频处理效率和质量都能上一个台阶。

公众号:蓝海资料掘金营,微信deep3321