FFmpeg 指南:视频、音频、图片它全能批量编辑。
作为一款开源的免费应用,FFmpeg 功能的丰富程度和便利性,让它俘获了一大批命令行用户。
在官方没有提供任何图形界面的情况下,了解核心使用场景、掌握基本的命令参数,会提高处理任务的效率。
· · ·
一、FFmpeg 基础
1. 名字从何而来
FFmpeg
这个名字不太好念,长得也有点奇怪。
FF
指的是 Fast Forward,mpeg
则是 Moving Picture Experts Group。
2. 命令格式
ffmpeg {全局参数} {输入文件参数} -i {输入文件} {输出文件参数} {输出文件}
3. 基本命令参数
命令 |
简介 |
备注 |
-i |
设置输入文件 |
input |
-f |
设置输出格式 |
format |
-c copy |
直接复制,不经过重新编码(这样比较快) |
|
-c:v |
设置视频编码器 |
相当于 -vcodec,是 -codec:v 的简写 |
-c:a |
设置音频编码器 |
相当于 -acodec,是 -codec:a 的简写 |
-c:s |
设置字幕编码器 |
相当于 -scodec,是 -codec:s 的简写 |
-b:v |
设置输出视频的比特率 |
bit |
-b:a |
设置输出音频的比特率 |
bit |
-ss |
设置开始时间 |
|
-t |
设置持续时间 |
单位为秒 |
-to |
设置结束时间 |
|
-vf |
创建和设置过滤图,并用它来过滤流 |
|
-vf scale= |
设置输出视频的宽度和高度 |
|
-vf setsar= |
设置过滤器输出视频的样本纵横比 |
|
-vf subtitles= |
设置字幕 |
|
-loop 1 |
无限循环 |
|
-shortest |
让生成的视频最短化 |
|
-vn |
去除视频流 |
video not |
-an |
去除音频流 |
audio not |
-ar |
设置音频码率 |
audio rate |
-ac |
设置声道数 |
1:单声道;2:立体声;转换单声道的 TVrip 可以用 1(节省一半容量) |
-frames:v |
设置要输出的视频帧数 |
缩写:-vframes;相当于 -filter:v |
-crf |
质量控制 |
参数的设置范围是 0~50,数值越小代表清晰度越高,建议值域为 18~28。 |
备注:
关于 crf 的值:
量化器标度的范围是 0-51:其中 0 是无损,23 是默认值,51 是最坏的。较低的值表示较高的质量,主观上合理的范围是 18-28。
将 18 视为视觉无损或接近无损:它应该与输入看起来相同或几乎相同,但在技术上并非无损。
范围是指数级的,因此增加 CRF 值 +6 大约是比特率的一半,而 -6 大约是比特率的两倍。
一般用法是选择仍能提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值,如果看起来很差,则选择较低的值。
· · ·
二、FFmpeg 实例:截取
1. 视频截取
ffmpeg -i input_1.mp4 -ss 00:02:25 -to 00:05:34 -c copy output_1.mp4
ffmpeg -i input_1.mp4 -ss 00:02:25 -t 00:02:00 -c copy output_2.mp4
FFmpeg 截视频默认采用关键帧,所以输出的时间和设置的时间,可能有若干秒的误差。
2. 音频截取
ffmpeg -i input_1.mp3 -ss 00:02:24.5 -to 00:05:38 -c copy output_1.mp3
ffmpeg -i input_1.mp3 -ss 00:02:24.5 -t 00:02:00 -c copy output_2.mp3
3. 音频视频的淡入淡出
// 淡入淡出
ffmpeg -i input_1.flac -af "afade=t=in:st=1:d=2,afade=t=out:st=131:d=2" output_0.flac
// 淡入
ffmpeg -i input_1.flac -af "afade=t=in:st=0:d=3" output_1.flac
// 淡出
ffmpeg -i input_1.flac -af "afade=t=out:st=131:d=2" output_2.flac
· · ·
三、FFmpeg 实例:提取
1. 从视频提取音频
提取 mp3 格式:
// 推荐
ffmpeg -i input_1.mp4 output_3.mp3
ffmpeg -i input_1.mp4 -acodec libmp3lame output_1.mp3
ffmpeg -i input_1.mp4 -f mp3 -vn output_2.mp3
ffmpeg -i input_1.mp4 -f mp3 -ar 16000 output_4.mp3
提取 m4a 格式:
ffmpeg -i input_1.mp4 -acodec copy -vn output_1.m4a
提取 aac 格式:
ffmpeg -i input_1.mp4 -acodec copy -vn output_1.aac
提取 wav 格式:
ffmpeg -i input_1.mp4 -ac 1 -ar 16000 -f wav output_1.wav
ffmpeg -i input_1.mp4 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 -f wav output_2.wav
2. 视频提取的某一帧
// 推荐
ffmpeg -i input_1.mp4 -ss 00:00:01 -frames:v 1 output_1.png
如果时间戳不靠前,提取速度会比较慢。这时直接用 PotPlayer 的图像截取会更快。
3. 视频提取封面
// 推荐
ffmpeg -i input_1.mp4 -map 0:v -map -0:V -c copy output_1.png
如果报错信息是:Output file #0 does not contain any stream,说明视频未附有封面。
没封面的视频,在文件浏览器看到的,只是解码器读到的关键帧缩略图。
· · ·
四、FFmpeg 实例:添加
1. 视频加硬字幕
// 推荐
ffmpeg -i input_1.mp4 -vf subtitles=input_1.ass -c:a copy output_1.mp4
直接复制音频可以防止音频被压缩。
2. 视频加软字幕
// 推荐
ffmpeg -i input_1.mp4 -i input_1.ass -c copy -c:s mov_text output_1.mp4
3. 视频加封面
// 推荐
ffmpeg -i input_1.mp4 -i input_1.png -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic
output_1.mp4
4. 音频加封面
// 推荐
ffmpeg -i input_1.mp3 -i input_1.png -map 0 -map 1 -c copy -disposition:v:0 attached_pic output_1.mp3
· · ·
五、FFmpeg 实例:转码
1. dvd / iso 直转 mp4
ffmpeg -i input_1.iso -preset superfast -vf yadif -crf 18 output_1.mp4
2. vob 格式转 mkv
ffmpeg -i input_1.vob -preset superfast -crf 18 -c:a ac3 -c:s copy -map 0:1 -map 0:2 output_1.mkv
-c:a 是 -codec:a 的简写,冒号后面的 a 是 audio 音频的简写,s 是 subtitle 的简写。
这个参数用来指定视频、音频、字幕所采用的编码器,copy 表示沿用源视频的编码器。
0:0 是 DVD 的菜单,0:1 是视频部分,0:2 和 0:3 是音频部分,0:4 和 0:5 是字幕。
3. vob 格式转 mp4
// 码率约 2000,推荐
ffmpeg -i input_1.vob -preset superfast -crf 18 -c:a copy -map 0:1 -map 0:2 output_1.mp4
// 码率约 1500,速度太慢
ffmpeg -i input_1.vob -c:v libx264 -crf 18 -vf yadif -c:a ac3 -b:a 448k output_2.mp4
// 码率约 1000
ffmpeg -i output_1.vob -c:a copy -codec:v libx264 output_3.mp4
// 码率约 1000
ffmpeg -i input_1.vob -c:a aac -aq 100 -c:v libx264 -c:s mov_text -map 0:1 -map 0:2
-movflags +faststart -vb 1000k -maxrate 1500k -bufsize 500k output_4.mp4
// 码率约 800
ffmpeg -i input_1.vob output_5.mp4
// 码率约 500
ffmpeg -i input_1.vob -preset superfast -crf 28 -c:a ac3 output_6.mp4
// 码率约 400
ffmpeg -i input_1.vob -vcodec mpeg4 -b:a 1200k -mbd 2 -flags +mv4 -trellis 2 -cmp 2 -subcmp 2
-metadata title=output output_7.mp4
// 码率约 300,分辨率改变
ffmpeg -i input_1.vob -vcodec libx265 output_8.mp4
· · ·
六、FFmpeg 实例:合并
1. 无损合并 mp4
// 推荐(数量少的话)
(echo file 'input_1.mp4' & echo file 'input_2.mp4')>input_1.txt
ffmpeg -safe 0 -f concat -i input_1.txt -c copy output_1.mp4
// 转成 ts 再合并
ffmpeg -i input_1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i input_2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
// 批量合并文件夹下的 mp4
(for %i in (*.mp4) do @echo file '%i') > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy output_1.mp4
// 批量合并文件夹下的 mp4,包含隐藏文件
for /f "delims=" %a in ('dir /b/a-d *.mp4') do (echo file '%cd%\%a' >> list.txt)
ffmpeg -f concat -safe 0 -i list.txt -c copy output_1.mp4
2. 音频和图片合并,转成视频
// 推荐
ffmpeg -loop 1 -i input_1.jpg -i input_1.mp3 -c:v libx264 -c:a aac -b:a 330k -vf scale=1080:1080
-shortest output_1.mp4
// 如果是无损音频格式,例如 flac,可以封装进 mkv 里
// 同样的画质,libx265 压制的视频体积更小,但对机器性能要高点,介意的可以选 libx264
ffmpeg -loop 1 -i input_1.png -i input_1.flac -c:v libx265 -c:a copy -shortest output_1.mkv
// 把图片转成不带音频的视频
ffmpeg -loop 1 -i hr-1.png -c:v libx265 -t 292 output_1.mkv
· · ·
七、FFmpeg 实例:图片压缩
1. 图片转码压缩
ffmpeg -i input.png output_1.jpg
ffmpeg -i input.png output_1.webp
ffmpeg -i input.png output_1.bmp
2. 图片压缩
ffmpeg -i input_1.png -vf palettegen=max_colors=256:stats_mode=single output_1.png
ffmpeg -i input_1.png -i tmp.png -lavfi "[0][1:v] paletteuse" -pix_fmt pal8 output_1.png
3. 图片长宽像素减半
// 推荐
ffmpeg -i input.png -vf "scale=iw/2:ih/2" output.png
· · ·
总结
FFmpeg 基本能满足我对视频、音频的处理需求,部分图片需求也是用它处理。
学完之后最划算的地方,就是能够迅速处理大批量的任务。
比如上百张图片的格式转换、压缩、去水印、加水印等等。
比如时常需要做无损合并视频,FFmpeg 支持的格式很多,写个脚本能一直复用,还能和其他任务一起做成流水线,这样效率就更高了。
最后,要说有什么不满意的地方,就是跑出来的成品偶尔会有些小问题。
比如无损合并视频之后,时间轴可能会出现偏差,特别是几分钟的小视频,出问题的概率更高。当然也可能因为源视频有问题。
· · ·
相关
提示
本文中所有的 input. 和 output. 都是文件名示例,在使用命令时,需要替换成实际的文件名或者路径名。
参考链接
[官网] FFmpeg 官方英文文档