自用ffmpeg压制命令详解
公共参数
-i
:输入(input)文件;-crf
:控制输出文件质量,该参数取值范围为0~51,该参数值越大文件质量越差,但文件会越小,值为0时为无损(输出和输出质量相同),同时该参数对压制时间也有影响;-lavfi "subtitles=sub.ass"
:定义一个复杂的过滤图,这里是相当于将输入文件当作底片,将subtitles
覆盖于“底片”之上;-c:v
和-c:a
:控制编码过程中对视频(v)和音频(a)的编码方式,当该参数为copy
时代表复制源文件的编码格式(不做编码直接复制),执行ffmpeg -codecs
可以查看本机支持的编解码格式;
软字幕
软字幕是相对于硬字幕而言的,硬字幕是以图形方式直接“写”在帧上方(参考Ps中的“合并图层”);软字幕则是以文本的方式存储于文件中单独的某个轨道上(参考Pr的多轨道)。
提取
1 | ffmpeg -i Source.mkv -map 0:s:0 subs-out.srt |
以上代码假设了视频的名称为Source.mkv
,其中:
-i
参数后面跟随输入带有软字幕的文件;-map
指出提取的是视频中的哪部分;- 后面跟着的第一个0是指「第一个视频(流)」(这里只有一个视频(流));
- s指的是「subtitles字幕」;
- 最后的0指字幕中的第一个(因为视频可以含有多个字幕文件);
- 最后的文件名
subs-out.srt
是输出的文件名。
删除
使用-sn
开关删除软字幕。
1 | ffmpeg -i "Source.mkv" -vcodec copy -acodec copy -sn "Output-No-Subs.mkv" |
压入
1 | ffmpeg -i "Source.mkv" -i sub.ass -codec copy -map 0 -map 1 "Output.mkv" |
精准切割
1 | ffmpeg -ss 00:00:00.000 -accurate_seek -to 00:14:07.468 -i Source.mkv -lavfi "subtitles=sub.ass" -crf 21 -c:a copy "Output.mp4" |
该行命令的解释为:从00:00:00.000
开始在Source.mkv
中精确寻找到00:14:07.468
并裁切下来,同时压入名为sub.ass
的字幕,质量参数为21
,音频轨道编码方式直接复制源文件编码格式,输出文件为"Output.mp4"
。
注意,只有在输入文件(-i
)在查找参数(-accurate_seek
)后面时精确查找才会生效。
压制
1 | ffmpeg -i "Source.mkv" -c:v h264_nvenc -lavfi "subtitles=sub.ass" -crf 21.5 -c:a copy "Output-Main.mp4" |
关于NVENC
NVENC是由NVIDIA开发的一个API,允许使用NVIDIA GPU显卡执行h.264和HEVC(H.265)编码。FFmpeg通过h264_nvenc
和hevc_nvenc
编码器支持NVENC。
要想在ffmpeg中使用NVENC,你需要一个支持硬件编解码的英伟达GPU、英伟达GPU驱动程序(最好是最新的Studio(SD)版)、在编译时配置了--enable-nvenc
的ffmpeg二进制文件。
查看是否支持,只需在命令窗口执行ffmpeg -codecs
,在返回中查找:
- 在
configuration
(编译配置参数)中必须要有--enable-nvenc
; - 在下方的编解码器支持中必须有如下行(
Encoder
中必须要有h264_nvenc
):
1 | DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders: libx264 libx264rgb h264_amf h264_mf h264_nvenc h264_qsv ) |
如果显卡驱动版本过低或硬件不支持会报错,根据错误提示升级显卡驱动或升级硬件即可。