10、视频裁剪与缩放:使用crop和scale滤镜裁剪视频区域、调整分辨率
视频处理中,裁剪和缩放是最常用的两个操作。说白了,一个是从画面里切出一块区域,另一个是把整幅画面放大或缩小。我做了这么多年音视频,这两个滤镜几乎每天都在用。今天咱们就好好聊聊FFmpeg里的crop和scale滤镜。
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=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个像素。我在项目中做过一个视频会议系统,需要根据发言人位置动态裁剪画面,用的就是这种思路。
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,然后上下加黑边。
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 知识体系总览
下面这张图总结了本章的核心内容,帮你理清思路:
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
这个命令在视频网站的后台处理中很常见。我曾经给一个短视频平台做过缩略图生成服务,每天要处理上百万个视频,用的就是类似的命令。关键是要控制好裁剪区域和缩放比例,保证缩略图能准确反映视频内容。
公众号:蓝海资料掘金营,微信deep3321