whatshot实用的 FFmpeg 脚本合集

@Ta 2022-01-25发布,2022-09-19修改 11887点击

收集个人认为实用的 FFmpeg 脚本。

脚本中的参数如无特殊说明,则表示我认为参数一般无需更改,可以直接拿去用。

欢迎大家补充改进。

目录

视频转 GIF | 时间重采样 | 降低视频抖动
获取媒体文件属性 | 压缩音频为无损 FLAC | 压缩音频为 Opus
歌曲移除人声 | 改变音频音量 | 视频转 AV1


1. 视频转 GIF

$ 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 可以提供更好的画质和更小的体积,并且能够快速处理时长很长(超过一小时)的视频文件。


2. 时间重采样

时间重采样(Time interpolation)有时也称作“补帧”。

此条目內 60目标帧率

2.1 帧采样 (默认,Frame Sampling)

速度最快,不能改善视频流畅度

$ ffmpeg -input.mp4 -vf "minterpolate='fps=60:mi_mode=dup'" blend.mp4

2.2 帧混合 (Frame Blending)

速度快,效果一般

$ ffmpeg -i input.mp4 -vf "minterpolate='fps=60:mi_mode=blend'" blend.mp4

2.3 光流法(Optical Flow)

速度非常慢,消耗较高内存,效果较好

$ ffmpeg -i input.mp4 -vf "minterpolate='fps=60:mi_mode=mci:mc_mode=aobmc:vsbmc=1'" optical_flow.mp4

3. 降低视频抖动

$ 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 PhotosPremiere Pro好。


4. 获取媒体文件属性

$ 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

补充说明:FLACFFprobe 中的特殊情况

对于大部分音频,FFprobeSTREAM中有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

5. 压缩音频为无损 FLAC

$ ffmpeg -i input.wav -c:a flac -compression_level 12 output.flac

6. 压缩音频为 Opus

$ ffmpeg -i input.wav -c:a libopus -b:a 128k output.ogg

128k为比特率。

Opus可能是目前压缩率最佳的音频编码器,在极低的比特率下也能提供优秀的音质,且大部分软件都兼容此格式。


7. 歌曲移除人声

$ ffmpeg -i song.mp3 -af pan="stereo|c0=c0|c1=-1*c1" -ac 1 karaoke.mp3

会将歌曲转换为单声道,效果类似卡拉OK。


8. 改变音频音量

$ ffmpeg -i input.wav -filter:a "volume=音量" output.wav

音量填写方式:

调节音量至... 填写
50% 0.5
150% 1.5
提高 10 分贝 10dB
降低 10 分贝 -10dB

9. 视频转 AV1

$ 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|隐藏机器人聊天)
  • @Ta / 2022-01-25 / /
    给大佬暖贴
  • @Ta / 2022-01-26 / /
    @姜辰,抛砖引玉
  • @Ta / 2022-01-26 / /
    - - blog:LDXW.TOP
  • @Ta / 2022-01-26 / /
    小米MIX2s(白)
  • @Ta / 2022-01-26 / /
  • @Ta / 2022-01-28 / /
    修改了视频转换GIF的脚本,转换速度大幅提升了!
  • @Ta / 2022-08-03 / /

    @tasy5kg,有 动态 avif 和 动态 webp 互转的 ffmpeg 脚本吗?

    (可使用avifenc, avifdec, cwebp, dwebp,最好尽可能使用匿名/命名管道来传数据)

    比如,我贴个heifavif的:

    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
    
  • @Ta / 2022-08-03 / /
    @无名啊,我不太熟悉除 ffmpeg 以外的工具。

    只是好奇,你经常在哪些平台使用动态 webp、avif?

    我主要使用 Android 手机,这些格式经常遇到兼容性问题,所以我不太喜欢用
  • @Ta / 2022-08-03 / /
    @无名啊,我觉得假如能够使用视频,就应该避免使用动图,而是将内容 H.264/AV1 编码成 mkv/mp4
  • @Ta / 2022-08-03 / /

    @tasy5kg,我在做在线压缩图片的小插件,尝试各种格式互转时碰到这俩货。。

    webp应该都支持了吧?新一点儿的安卓也支持avif(我红米K40自带的浏览器内核已支持)

    avif压缩率挺好的,损失不大的情况下,原图可压缩 90% 左右

    测试数据:230个文件,共135MB,来源是当时这个回复下的图片集

  • @Ta / 2022-08-03 / /

    @tasy5kg,『损失不大』是指cq-level=33

    对比效果可去用用squoosh,一个在线浏览器端图片转码工具,里面avif默认的Quality=30就是cq-level=33(63-30=33)

  • @Ta / 2022-08-03 / /

    @无名啊,我用的也是红米 K40,Android 12。我测试了一下:

    小米相册 QQ 微信
    动态 avif 仅第一帧 不支持 不支持
    动态 webp 仅第一帧 仅第一帧 仅第一帧
    AV1 视频 支持 支持 不支持

    我仍然认为假如能够使用视频,就应该避免使用动图。视频的兼容性、压缩率和扩展性都不会比动图差。

  • @Ta / 2022-08-03 / /

    @tasy5kg,我是用在hu60的。。

  • @Ta / 2022-08-03 / /

    @tasy5kg,所以只测浏览器

  • @Ta / 2022-08-03 / /

    @tasy5kg,对了,对于ffmpeg不支持的格式,怎么获取媒体属性呢?比如:heif、avif、bpg、jpeg xl

    我目前知道一个 mediainfo,好像比ffmpeg 多一些格式支持

  • @Ta / 2022-08-06 / /
    @无名啊,我暂时不知道。

    似乎有人正在开发 ffmpeg 的 heif 支持。
    https://trac.ffmpeg.org/ticket/6521
    https://trac.ffmpeg.org/ticket/7621#comment:10
  • @Ta / 2022-08-06 / /

    @tasy5kg,我好像在 github issue 里看到过,5.1 版本支持 avif ?可我的 debian testing 都没那么新。。

  • @Ta / 2022-08-06 / /

    @tasy5kg,动态 webp,7年了,好像都没人管
    https://trac.ffmpeg.org/ticket/4907

  • @Ta / 2022-08-06 / /
    @无名啊,试试snapshot版本?http://ffmpeg.org/download.html
添加新回复
回复需要登录