一些碎碎念

最近在整理自己日益增长的电影库,其中下载的很多电影都有多语言音轨,或者字幕不全。借着这次整理将ffmpeg的简单使用方法整理下来。

ffmpeg的使用

对于多出来的一些音轨和字幕我选择将其删除以减小视频文件的体积、没有字幕的文件则在网上寻找字幕并内封至视频文件内。由于自己电脑太垃圾,就不再进行二次转码了,主要是源视频轨和音轨的复制。
命令例:

# 复制音轨/字幕(流拆分)
ffmpeg -i The.Outpost.2020.WEB.H.265.2160p.mkv -map 0:v -map 0:a:1 -map 0:s:2 -c copy tmp.mkv
# 添加内封字幕(流合成)
ffmpeg -i The.East[1080p][H264].mp4 -i English.eng.srt -i Dutch.dut.srt -map 0 -map 1 -map 2 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 title=English -metadata:s:s:1 language=dut -metadata:s:s:1 title=Dutch test.mp4

命令解释

  • -i 文件名:指定输入文件,可以是视频,也可以是音频/字幕文件。
  • -map [0-n]:[v:a:s]:[0-n]:流选择器
    第一个数字是-i的文件序号,且数字从0开始。
    第二个字母是流的类型,v:视频轨、a:音轨、s:字幕轨(可省略,未指定则代表所有流)
    第三个数字是流编号,从0开始计数,且每种流都是独立计数(可省略,未指定则代表所有流)
  • -c:指定编码
    -c copy:仅复制视频源数据并进行封装,不会对视频进行编码。
    -c:[0-n]:[v:a:s]:[0-n]:同map一样,可以指定流。
    对于视频编码来说,一般的整理用copy即可,需要二次编码时则可指定为h264hevc等。
    对于字幕编码来说,一般srt字幕需指定为在mp4中的编码为mov_textmkvsrt文件编码为srt[1],ass文件为ass
  • -metadata:指定数据类型,K V形式。一般用于设置流的语言和标题
    -metadata:s:s:0 language=eng:设置第一个字幕的语言为英语。

  1. 编码不匹配则会引起Subtitle codec 94213 is not supported.错误。 ↩︎