引言
現在的短視頻非常流行。大多數情況下我們會開着音量或者戴着耳機收看視頻。但有些時候不是太方便,如果視頻能有一個字幕就好了。

好消息是,字幕制作的軟件很專業很好用,而且上手超級簡單。
壞消息是,如何把字幕合成到視頻音頻文件內?或者把字幕文件從視頻文件提取出來,都需要不少工具!
我們今天講解使用 ffmpeg 解決大家的這個痛點。
學習時間
1 - 軟編碼
MP4支持流式文本格式的字幕,但是在播放器和設備中,回放功能的支持並不統一。使用流處理進行語音頻道的復制,基本的用法結構如下:
ffmpeg -i input.mkv -c copy -c:s mov_text output.mp4
再深入一步,使用流式處理並復制音頻和視頻流,將基於文本的字幕輸入流,可以是 srt ass vtt 等字幕文件,轉換為流式文本,並設置前兩個字幕流的語言格式,需要這樣寫指令:
ffmpeg -i input.mkv -map 0 -c copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4
注意到上面我們使用 -c copy 選項,把音視頻流整體拷貝出來了。如果想要使用指定的編碼器,比如 MP4 格式使用的 H.264,可以這樣寫:
ffmpeg -i input.mkv -map 0 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4
上面這個指令中 -map 0 我們改造一下,指定使用第一個視頻流,第二個音頻流,第三個字母文本流,需要這樣寫:
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -map 0:s:2 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng output.mp4
2 - 硬編碼
首先說一下基於文本的字幕輸入。我們使用ffmpeg 的 subtitle filter 過濾器處理字幕輸入文件,格式通常是 ass srt vtt 等。這樣的編碼方式,比上一節中使用的軟編碼方式要慢的多,因為進行了重新編碼。
對音頻文件流拷貝,並使用 subtitle 過濾器,基本用法如下:
ffmpeg -i input.mkv -filter_complex "subtitles=input.mkv" -c:a copy output.mp4
輸入流當然也可以任意指定,比如使用第三路視頻流,第五路字幕流,第一路音頻流,需要這樣改寫指令:
ffmpeg -i input.mkv -filter_complex "[0:v:2]subtitles=input.mkv:si=4[v]" -map "[v]" -map 0:a:0 -c:a copy output.mp4
如果有字幕組,專門給音視頻文件配上字幕。像國內比較常見的對國外影視作品的引進,需要翻譯人員制作字幕,那么翻譯組生成字幕文件后,如何合並入音視頻文件內呢?
只要像下面這么寫:
ffmpeg -i input.mp4 -filter_complex "subtitles=your-subtitles-file.srt" -c:a copy output.mp4
還有一種處理方式,是基於圖像的字幕輸入,使用覆寫的方式。比如,我們把第四路字幕流,覆蓋到第二路視頻流上,同時拷貝第七路音頻流。這時候需要 ffmpeg 的 overlay filter 過濾器,這樣寫指令:
ffmpeg -i input.mkv -filter_complex "[0:v:1][0:s:3]overlay[v]" -map "[v]" -map 0:a:6 -c:a copy output.mp4
寫在最后
通過上述幾個例子,大家應該對 map 選項,v,a,s 流通道有深刻的認識了吧。
找一段高清完備的音視頻,嘗試着從中提取或合成新的文件,實踐起來吧。