首页 / FFmpeg 入门教程 / 常用视频滤镜

FFmpeg 入门教程

常用视频滤镜

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

FFmpeg视频滤镜scalecroppadtransposesetpts

本节目标:把日常 80% 会用到的视频滤镜学会,包括缩放、裁剪、填充、旋转翻转、调速和帧率调整。语法基础已在上一章讲透,这一章直接用。

一、scale:缩放

scale 是使用频率最高的滤镜,用于改变分辨率。

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

保持宽高比

宽或高写 -1 表示按比例自动计算:

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

但 H.264/H.265 要求宽高是偶数,自动算出来可能是奇数导致报错。所以推荐写 -2,它会自动取最接近的偶数:

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

常用表达式

写法含义
scale=iw/2:ih/2宽高都缩一半
scale=min(1280,iw):-2最大不超过 1280 宽,小于则不放大
scale=-2:720:flags=lanczos用 lanczos 算法,缩小质量更好

flags=lanczos 在降采样时画面更锐利,做 1080p→720p 时建议加上。放大则用 flags=bicubic 即可。

二、crop:裁剪

crop=宽:高:x:y,从 (x,y) 位置裁出一块区域:

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

不写 x、y 默认居中裁剪。裁掉四周 20 像素:

ffmpeg -i input.mp4 -vf "crop=iw-40:ih-40" output.mp4

iwih 是输入宽高的内置变量。

三、pad:填充黑边

pad 给画面加边,常用于把竖屏视频嵌进横屏画布(加黑边):

ffmpeg -i input.mp4 -vf "pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" output.mp4

参数是 pad=总宽:总高:偏移x:偏移y:颜色(ow-iw)/2 让原画面水平居中。

scale + pad 组合:等比放进指定尺寸

这是最常用的组合之一——把任意比例的视频等比缩放到 1920×1080 画布内,不足的地方补黑边:

ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4

force_original_aspect_ratio=decrease 让 scale 在不超出目标尺寸的前提下等比缩放,然后 pad 补齐。发朋友圈、B站投稿需要统一分辨率时非常好用。

四、transpose / rotate:旋转与翻转

transpose 是固定角度旋转,最常用:

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
关键字效果
0cclock_flip逆时针 90° 并垂直翻转(默认)
1clock顺时针 90°
2cclock逆时针 90°
3clock_flip顺时针 90° 并垂直翻转

旋转 180° 用两次:transpose=2,transpose=2

镜像翻转不需要 transpose:

ffmpeg -i input.mp4 -vf "hflip" output.mp4   # 水平镜像
ffmpeg -i input.mp4 -vf "vflip" output.mp4   # 上下翻转

rotate 滤镜支持任意角度,比如旋转 30°:

ffmpeg -i input.mp4 -vf "rotate=PI/6" output.mp4

但任意角度旋转后角落会出现黑边,需要配合 pad 或裁剪。

五、fps:改帧率

ffmpeg -i input.mp4 -vf "fps=30" output.mp4

把视频转为 30fps。高帧率转低帧率会丢帧,低转高不会增加真实细节(只是重复帧)。做 GIF 时常用 fps=15 减小体积。

六、setpts:调整播放速度

setpts 修改时间戳,实现快放/慢放:

ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" output.mp4    # 慢放 2 倍
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4    # 快放 2 倍

PTS 是当前帧的时间戳。系数越大画面越慢,越小越快。注意:setpts 不改音频,调速后视频和音频会不同步。要同时调音频要用 -filter_complexatempo

ffmpeg -i input.mp4 -filter_complex \
  "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
  -map "[v]" -map "[a]" output.mp4

七、其他实用滤镜速览

滤镜作用示例
eq亮度对比度饱和度eq=brightness=0.05:saturation=1.2
boxblur模糊boxblur=5:1
unsharp锐化unsharp=5:5:1.0
noise加噪点noise=alls=10:allf=t
format转换像素格式format=yuv420p(保证兼容性)
trim按帧截取(配合 setpts)trim=start=10:end=20,setpts=PTS-STARTPTS
reverse倒放reverse(占内存,短视频用)
Tip

缩放后加 format=yuv420p 是个好习惯。有些源是 yuv444p 或 yuv422p,H.264 baseline/main profile 和很多播放器只认 yuv420p。命令写成 -vf "scale=-2:720,format=yuv420p" 可以避免 QuickTime 等播放器只有声音没有画面的问题。

八、串联常用链

滤镜的真正威力在于组合。几个日常能直接用的滤镜链:

缩放到 720p 并保证兼容:

-vf "scale=-2:720,format=yuv420p"

居中裁成正方形(适合 Instagram):

-vf "crop=min(iw\,ih):min(iw\,ih)"

先裁剪再缩放:

-vf "crop=iw:iw*9/16,scale=1080:1920"

(注意:在命令行里,逗号本身是滤镜分隔符,所以 crop 参数里的逗号要转义成 \,,或者整个 filtergraph 用引号包住。)

Note

内置变量除了 iw/ih(输入宽高),还有 ow/oh(输出宽高)、a(宽高比)、sar/dar(采样/显示宽高比)。写表达式时善用它们,比硬编码数字灵活得多。