使用 FFmpeg 合併影片與字幕
FFmpeg 可以解析 srt、ass 等字幕檔,但是在 compile FFmpeg 時需要開啟 libass,FFmpeg 才能正確載入 ass 字幕檔。
若是使用 Windows 平台且還沒安裝 FFmpeg 的,可以點此前往安裝說明文喔。要如何判斷目前安裝的 FFmpeg 有沒有開啟 libass 的功能呢?很簡單,在終端機(Terminal)、命令提示字元(以下簡稱 cmd)、Powershell 等文字介面下打上 ffmpeg -version
,由 FFmpeg 回傳的內容中有出現 --enable-libass
則代表有 libass 的功能。
ffmpeg version git-2020-07-24-21442a8 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.3.1 (GCC) 20200621
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 57.100 / 56. 57.100
libavcodec 58. 97.100 / 58. 97.100
libavformat 58. 49.100 / 58. 49.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
上方是由我電腦回傳的內容,可以用 Ctrl + F 搜尋 --enable-libass
找到他出現的位置。
基礎指令
ffmpeg -i input.mkv -vf "ass=filename=input.ass:fontsdir=fonts" output.mp4
ass 字幕檔含有不同的字體設定,預設 ffmpeg 會自動抓取系統內已安裝的字體進行使用,如果遇到沒有安裝的字體則會另外找替代字體。若每次輸出時都需要安裝所有的字體想必系統內的字體會非常雜亂、混亂,所以在指令列中可以用 fontsdir 指定字體儲存的資料夾。
ass filter 的參數大部分與 subtitles 的參數相同,相同的有 filename(可用 f 縮寫)、original_size、fontsdir、alpha、force_style,剩下的是專屬於 subtitles 的有:charenc、stream_index(可用 si 縮寫)。
- filename:檔案名稱。無其他參數時可省略不寫。
- original_size:原始影片的尺寸,相關的尺寸縮寫可以點此前往 FFmpeg Documentation 查看。
- fontsdir:字體檔資料夾。
- alpha:是否開啟 alpha channel。
- force_style:以後方指定的參數覆蓋檔案中的設定,若有多參數請用英文半形逗號分隔。值使用 ass 之格式(採
KEY=VALUE
形式)。 - charenc(subtitle 限定):編碼,預設為 UTF-8。
- stream_index:串流索引,指定 mkv 檔案中字幕的串流編號。
此外,在 ass filter 裡各個參數間使用英文半形冒號分隔,請不要與其他分隔符號搞混。為了避免空白的老馬,建議在輸入參數的值的時候用雙括號或單括號包起來,避免因為空白等讓 FFmpeg 誤判指令。
因為包在 mkv 裡的 ass 字幕檔不支援使用 stream_index 指定,所以需要用到 mkv 的抽出程式將字幕檔抽出後再用指令以 FFmpeg 合併。
雖然這裡主要以 ass 做例子,但 subtitles 的用法也大同小異。ass filter 與 subtitles filter 的差異在於 ass filter 是給 ass 字幕使用;subtitles filter 是給 srt 字幕使用。
題外話
想知道本篇文的封面圖利用那些資源製成的請下方留言。