FFmpeg Filter(滤镜)是 FFmpeg 中最强大的功能之一,可以对音视频进行各种复杂的处理操作。
Filter 基本语法
Filter 链语法
bash# 基本格式 -filter "filter1=param1=value1:param2=value2,filter2=param1=value1" # 复杂 filter 链 -filter_complex "[0:v]scale=1280:720[v];[0:a]volume=0.5[a];[v][a]concat=n=1:v=1:a=1"
Filter 标记说明
[0:v]:输入 0 的视频流[0:a]:输入 0 的音频流[v]:命名的输出流;:分隔不同的 filter 链,:分隔同一链中的 filter
常用视频 Filter
缩放 Filter (scale)
bash# 固定分辨率 ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4 # 保持宽高比 ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4 # 按比例缩放 ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4 # 限制最大尺寸 ffmpeg -i input.mp4 -vf "scale='min(1280,iw)':'min(720,ih)'" output.mp4
裁剪 Filter (crop)
bash# 裁剪中心区域 ffmpeg -i input.mp4 -vf "crop=640:480" output.mp4 # 指定裁剪位置 ffmpeg -i input.mp4 -vf "crop=640:480:10:10" output.mp4 # 裁剪右下角 ffmpeg -i input.mp4 -vf "crop=640:480:in_w-640:in_h-480" output.mp4
叠加 Filter (overlay)
bash# 在指定位置叠加图片 ffmpeg -i video.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4 # 叠加到右下角 ffmpeg -i video.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4 # 叠加到中心 ffmpeg -i video.mp4 -i logo.png -filter_complex "overlay=(W-w)/2:(H-h)/2" output.mp4
旋转 Filter (transpose)
bash# 顺时针旋转 90 度 ffmpeg -i input.mp4 -vf "transpose=1" output.mp4 # 逆时针旋转 90 度 ffmpeg -i input.mp4 -vf "transpose=2" output.mp4 # 旋转 180 度 ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4
文字绘制 Filter (drawtext)
bash# 添加简单文字 ffmpeg -i input.mp4 -vf "drawtext=text='Hello World':fontcolor=white:fontsize=24:x=10:y=10" output.mp4 # 添加带阴影的文字 ffmpeg -i input.mp4 -vf "drawtext=text='Hello':fontcolor=white:fontsize=32:x=10:y=10:shadowcolor=black:shadowx=2:shadowy=2" output.mp4 # 添加动态文字(时间戳) ffmpeg -i input.mp4 -vf "drawtext=text='%{pts\:hms}':fontcolor=white:fontsize=24:x=10:y=10" output.mp4
模糊 Filter (gblur)
bash# 高斯模糊 ffmpeg -i input.mp4 -vf "gblur=sigma=2" output.mp4 # 强模糊 ffmpeg -i input.mp4 -vf "gblur=sigma=5" output.mp4
锐化 Filter (unsharp)
bash# 锐化 ffmpeg -i input.mp4 -vf "unsharp=5:5:1.0:5:5:0.0" output.mp4 # 轻微锐化 ffmpeg -i input.mp4 -vf "unsharp=3:3:0.5:3:3:0.0" output.mp4
常用音频 Filter
音量 Filter (volume)
bash# 调整音量(1.0 为原始音量) ffmpeg -i input.mp4 -af "volume=0.5" output.mp4 # 提升音量 ffmpeg -i input.mp4 -af "volume=2.0" output.mp4 # 使用分贝 ffmpeg -i input.mp4 -af "volume=3dB" output.mp4
淡入淡出 Filter (afade)
bash# 淡入 3 秒 ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=3" output.mp4 # 淡出 3 秒 ffmpeg -i input.mp4 -af "afade=t=out:st=5:d=3" output.mp4
音频混音 Filter (amix)
bash# 混合两个音频 ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "amix=inputs=2:duration=first" output.mp3 # 混合三个音频 ffmpeg -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 -filter_complex "amix=inputs=3:duration=longest" output.mp3
音频延迟 Filter (adelay)
bash# 延迟音频 500 毫秒 ffmpeg -i input.mp4 -af "adelay=500|500" output.mp4 # 左右声道不同延迟 ffmpeg -i input.mp4 -af "adelay=500|1000" output.mp4
复杂 Filter 示例
画中画效果
bashffmpeg -i main.mp4 -i pip.mp4 -filter_complex \ "[1:v]scale=320:240[pip];[0:v][pip]overlay=10:10" \ output.mp4
多画面拼接
bashffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -i video4.mp4 \ -filter_complex \ "[0:v]scale=640:360[v0];[1:v]scale=640:360[v1];[2:v]scale=640:360[v2];[3:v]scale=640:360[v3]; \ [v0][v1]hstack[top];[v2][v3]hstack[bottom];[top][bottom]vstack" \ output.mp4
视频加速/减速
bash# 加速 2 倍 ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4 # 减速 0.5 倍 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
Filter 性能优化
使用硬件加速
bash# 使用 GPU 加速 filter ffmpeg -hwaccel cuda -i input.mp4 -vf "scale_npp=1280:720" output.mp4
预处理优化
bash# 先裁剪再缩放(减少处理像素) ffmpeg -i input.mp4 -vf "crop=640:480,scale=320:240" output.mp4
Filter 是 FFmpeg 最强大的功能之一,掌握 Filter 的使用可以实现对音视频的精细控制。