标题: [精]实用的 FFmpeg 脚本合集
时间: 2022-01-25发布,2022-09-19修改
收集个人认为实用的 FFmpeg 脚本。
脚本中的参数如无特殊说明,则表示我认为参数一般无需更改,可以直接拿去用。
欢迎大家补充改进。
视频转 GIF | 时间重采样 | 降低视频抖动
获取媒体文件属性 | 压缩音频为无损 FLAC | 压缩音频为 Opus
歌曲移除人声 | 改变音频音量 | 视频转 AV1
$ ffmpeg -an -skip_frame nokey -i 输入文件 -vf scale=导出分辨率:flags=fast_bilinear,palettegen=max_colors=色彩数量:stats_mode=diff 色板文件
$ ffmpeg -an -i 输入文件 -i 色板文件 -r 输出文件帧率 -lavfi "framestep=原视频帧率/输出文件帧率*变速速率,setpts=PTS/变速速率,scale=导出分辨率:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer" 输出文件
此脚本比较复杂,需要将汉字部分按下表进行填写替换:
参数名 | 填写示例 | 说明 |
---|---|---|
输入文件 | input.mp4 |
输入视频文件的路径 |
导出分辨率 | 320:240 |
长和宽必须都是2的倍数 |
色彩数量 | 128 |
可接受的值为[4, 256] ;值越大,色彩越保真,但输出的文件体积也越大; |
色板文件 | palette.png |
GIF 调色板文件。在第一行生成,并第二行使用到 |
视频帧率 | 60 |
输入的视频的帧率 |
输出文件帧率 | 10 |
输出的GIF 的帧率 |
变速速率 | 1.0 |
如果不需要变速,填写1.0 ;二倍速则填写2.0 ,依此类推 |
输出文件 | output.gif |
输出GIF 文件的路径 |
此脚本转换 GIF 可以提供更好的画质和更小的体积,并且能够快速处理时长很长(超过一小时)的视频文件。
时间重采样(Time interpolation)有时也称作“补帧”。
此条目內 60
指目标帧率
。
速度最快,不能改善视频流畅度
$ ffmpeg -input.mp4 -vf "minterpolate='fps=60:mi_mode=dup'" blend.mp4
速度快,效果一般
$ ffmpeg -i input.mp4 -vf "minterpolate='fps=60:mi_mode=blend'" blend.mp4
速度非常慢,消耗较高内存,效果较好
$ ffmpeg -i input.mp4 -vf "minterpolate='fps=60:mi_mode=mci:mc_mode=aobmc:vsbmc=1'" optical_flow.mp4
$ ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=10:result="mytransforms.trf" -f null -
$ ffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:input="mytransforms.trf",unsharp=5:5:0.8:3:3:0.4 stabilized.mp4
此操作需要两行:第一行分析视频input.mp4
的内容,并将结果保存至mytransforms.trf
;第二行生成稳定后的视频stabilized.mp4
。
速度较慢,且效果不如Google Photos
和Premiere Pro
好。
$ ffprobe -v error -show_format -show_streams input.mp4
上面将返回媒体文件的所有属性。
$ ffprobe -v quiet -select_streams V:0 -show_entries stream=width,height,r_frame_rate,bit_rate -of csv=p=0:sv=fail -i input.mp4
有时只需要媒体文件中的特定几项信息,可以通过类似这样的方式指定。(这条脚本将返回视频流的宽、高、帧率、比特率,中间以逗号分隔,如1920,1080,30/1,11895227
)
FLAC
在 FFprobe
中的特殊情况对于大部分音频,FFprobe
在STREAM
中有bit_rate
值;而对于FLAC
音频,STREAM
流中bit_rate
值为N/A
,需要在FORMAT
中获取bit_rate
值。
FFprobe
中的特殊情况上面的命令用来读取视频和音频可能足够了,但许多图片中的元数据存储在视频流的帧内,需要通过 -show_frames
获取更完整的信息,例如:
$ ffprobe -v error -show_format -show_streams -show_frames input.jpg
$ ffmpeg -i input.wav -c:a flac -compression_level 12 output.flac
$ ffmpeg -i input.wav -c:a libopus -b:a 128k output.ogg
128k
为比特率。
Opus
可能是目前压缩率最佳的音频编码器,在极低的比特率下也能提供优秀的音质,且大部分软件都兼容此格式。
$ ffmpeg -i song.mp3 -af pan="stereo|c0=c0|c1=-1*c1" -ac 1 karaoke.mp3
会将歌曲转换为单声道,效果类似卡拉OK。
$ ffmpeg -i input.wav -filter:a "volume=音量" output.wav
音量
填写方式:
调节音量至... | 填写 |
---|---|
50% | 0.5 |
150% | 1.5 |
提高 10 分贝 | 10dB |
降低 10 分贝 | -10dB |
$ ffmpeg -i "input.mp4" -c:v libaom-av1 -crf 画质参数 -b:v 0 -vf scale=分辨率 -cpu-used 8 -row-mt 1 output.mkv
参数名 | 填写示例 | 说明 |
---|---|---|
画质参数 | 30 | 可接受的值为[0, 63] 。值越大,文件体积越小,视频画质越差。参考值:0 为无损,23 为视觉无损。 |
分辨率 | 1920:1080 | 可以只指定宽度或高度,如-2:1080 |
『回复列表(33|显示机器人聊天)』
@tasy5kg,有 动态 avif
和 动态 webp
互转的 ffmpeg
脚本吗?
(可使用avifenc, avifdec, cwebp, dwebp
,最好尽可能使用匿名/命名管道来传数据)
比如,我贴个heif
转avif
的:
y4m=$(mktemp -u --suffix='.y4m')
mkfifo "$y4m"
heif-convert input.heif "$y4m" &
ffmpeg -v quiet -i "$y4m" -vf "scale=<限定大小>:force_original_aspect_ratio=decrease,format=yuv420p10" -f yuv4mpegpipe -strict -1 - |
avifenc --min 0 --max 63 --minalpha 0 --maxalpha 63 -a end-usage=q -a cq-level=<质量:63低-0高> -a tune=ssim -s 5 --stdin output.avif