首页 / FFmpeg 入门教程 / 缩放、裁剪与旋转

FFmpeg 入门教程

缩放、裁剪与旋转

本教程共 32 篇 · 第 13 篇 · 更新于 2026-08-09 · 约 6 分钟阅读

FFmpegscalecroptranspose缩放裁剪旋转滤镜

本节目标:用三个最常用的视频滤镜——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 重编码。

Note

FFmpeg 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 自动取偶数。
  • iwih 变量做相对缩放;force_original_aspect_ratio=decrease 配合 pad 装盒子。
  • crop=宽:高:x:y 裁剪,默认居中。
  • transpose=1 顺时针 90°,transpose=2 逆时针,180° 用两次或 hflip+vflip。
  • 滤镜用逗号串联,按顺序执行;所有视频滤镜都会触发重编码。

下一章讲拼接合并:怎么把多个视频片段拼成一个。