缩放、裁剪与旋转
本教程共 32 篇 · 第 13 篇 · 更新于 2026-08-09 · 约 6 分钟阅读
本节目标:用三个最常用的视频滤镜——scale、crop、transpose,完成画面尺寸和方向的调整。
画面的几何变换是最基础的视频处理。改分辨率适配手机、裁掉黑边、把竖拍视频转正,都离不开这三个滤镜。所有滤镜都会让视频重新编码,所以不能配合 -c:v copy 使用。
scale:缩放
scale 是使用率最高的滤镜,没有之一。基本用法:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
-vf 是 -filter:v 的简写,后面跟滤镜表达式。scale=1280:720 表示把画面缩放到 1280×720。
保持宽高比
写死宽高可能让画面被拉伸。让其中一边自动计算:
# 宽固定 1280,高度按比例自动
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
# 高固定 720,宽度按比例
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
-1 表示按原始宽高比自动算。但有个坑:自动算出来的可能是奇数,而 H.264 等编码器要求宽高是偶数。用 -2 代替 -1,FFmpeg 会自动取最近的偶数:
ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
用变量表达
scale 里可以用变量表示输入宽高:
iw/in_w:输入宽度。ih/in_h:输入高度。ow/out_w:输出宽度。oh/out_h:输出高度。
# 宽高都减半
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
# 宽度放大到 1.5 倍
ffmpeg -i input.mp4 -vf scale=iw*1.5:-1 output.mp4
# 最长边不超过 1280,短边自动
ffmpeg -i input.mp4 -vf "scale='min(1280,iw)':'min(1280,ih)':force_original_aspect_ratio=decrease" output.mp4
装进固定矩形(letterbox)
想把不同比例的视频统一塞进 1280×720 的盒子里,比例不对就补黑边:
ffmpeg -i input.mp4 \
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" \
output.mp4
force_original_aspect_ratio=decrease:按比例缩小到能放进 1280×720。pad:在缩小后的画面周围补黑边,填满整个 1280×720。(ow-iw)/2:水平居中。
选择缩放算法
默认用 bicubic。缩小时用 lanczos 或 spline 通常更锐利,放大时 bicubic 或 lanczos 更好:
ffmpeg -i input.mp4 -vf "scale=1280:-2:flags=lanczos" output.mp4
也可以用全局 -sws_flags:
ffmpeg -i input.mp4 -sws_flags lanczos -vf scale=1280:-2 output.mp4
Tip多个滤镜用逗号连起来,按顺序生效。
scale=...,pad=...表示先缩放再补边。
crop:裁剪
crop 用来裁掉画面的一部分。语法:
crop=宽:高:起始X:起始Y
起始坐标从左上角算,默认是画面中央。
裁一块固定区域
# 从左上角 (20,30) 开始,裁出 800×600
ffmpeg -i input.mp4 -vf crop=800:600:20:30 output.mp4
居中裁剪
不写起始坐标就默认居中:
# 从画面中央裁出 1280×720
ffmpeg -i input.mp4 -vf crop=1280:720 output.mp4
用变量裁
# 保留中间 3/4 的宽度
ffmpeg -i input.mp4 -vf "crop=iw*3/4:ih:iw/8:0" output.mp4
# 裁成正方形(取短边作为边长)
ffmpeg -i input.mp4 -vf "crop=min(iw\,ih):min(iw\,ih)" output.mp4
注意逗号在滤镜里要转义成 \,,否则会被当成滤镜分隔符。或者给整个表达式加引号。
自动检测黑边并裁掉
cropdetect 滤镜能检测黑边尺寸,但它只是输出检测结果,不直接裁。实际用法是先跑一遍看输出里的 crop 值,再用那个值裁:
ffmpeg -i input.mp4 -vf cropdetect -f null -
终端会输出类似:
[Parsed_cropdetect_0 @ 0x...] crop=1920:800:0:140
然后用这个值裁:
ffmpeg -i input.mp4 -vf crop=1920:800:0:140 output.mp4
transpose:旋转
transpose 是最常用的旋转滤镜,有 4 个预设值:
| 值 | 作用 |
|---|---|
| 0 | 逆时针转 90°,并垂直翻转(默认) |
| 1 | 顺时针转 90° |
| 2 | 逆时针转 90° |
| 3 | 顺时针转 90°,并垂直翻转 |
最常用的是 1 和 2:
# 顺时针 90°(竖拍视频转正)
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
# 逆时针 90°
ffmpeg -i input.mp4 -vf transpose=2 output.mp4
旋转 180°
transpose 没有直接的 180,调用两次:
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
或者用 hflip,vflip(水平翻转 + 垂直翻转):
ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4
只翻转不转
# 水平镜像
ffmpeg -i input.mp4 -vf hflip output.mp4
# 上下颠倒
ffmpeg -i input.mp4 -vf vflip output.mp4
元数据旋转(不重编码)
有些播放器(手机、QuickTime)会根据视频文件里的旋转元数据来显示方向。直接改这个元数据可以不重编码:
ffmpeg -display_rotation 90 -i input.mp4 -c copy output.mp4
但这只影响支持该元数据的播放器,兼容性不如直接转画面。要保证所有设备都正确显示,还是用 transpose 重编码。
NoteFFmpeg 9.0 也支持
-display_hflip和-display_vflip元数据开关。同时使用旋转和翻转时,会先旋转再翻转。
组合使用
滤镜可以串联完成多个操作。比如把视频顺时针转 90°,再缩放到宽 720,最后裁成正方形:
ffmpeg -i input.mp4 \
-vf "transpose=1,scale=720:-2,crop=720:720" \
-c:a copy \
output.mp4
执行顺序:先转 → 再缩放 → 再裁剪。音频用 -c:a copy 直接复制,不重新编码。
常见坑
画面被拉伸。
忘记用 -1 或 -2,写死了宽高。养成写一边自动算的习惯。
报错 width not divisible by 2。
自动算出来是奇数。把 -1 换成 -2。
滤镜表达式里有逗号、冒号、空格。 用引号把整个表达式包起来,必要时转义逗号。
旋转后文件变大了。 旋转后分辨率变了(比如从 1920×1080 变成 1080×1920),编码器需要重新工作。配合合适的 CRF 或码率控制体积。
小结
scale=宽:高缩放,-1按比例自动算,-2自动取偶数。- 用
iw、ih变量做相对缩放;force_original_aspect_ratio=decrease配合pad装盒子。 crop=宽:高:x:y裁剪,默认居中。transpose=1顺时针 90°,transpose=2逆时针,180° 用两次或 hflip+vflip。- 滤镜用逗号串联,按顺序执行;所有视频滤镜都会触发重编码。
下一章讲拼接合并:怎么把多个视频片段拼成一个。