容器和轉碼器

德瑞克赫曼
Derek Herman
喬梅利
Joe Medley

若要支援多種瀏覽器,需使用 FFmpeg 將 .mov 檔案轉換為兩個不同的容器:MP4 容器和 WebM 容器。實際上,您可能會同時指定轉碼器。目前,讓我們讓 FFmpeg 使用預設值

如果您不熟悉這些概念,請先詳閱「媒體檔案基本資訊」,再繼續操作。此外,如果您尚未安裝 FFmpeg,請參閱媒體應用程式基本資訊,開始使用 Docker 進行設定。

我們使用的是建議的 Docker 安裝作業,以及準備網頁版媒體檔案media 目錄內的 glocken.mov 檔案。我們針對本節中的所有指令使用 FFmpeg 4.3.2 版。

容器

首先,我們必須從 .mov 檔案,建立含有 .mp4.webm 副檔名的兩個容器,且該檔案同時包含音訊和影片串流。如要進一步瞭解容器和串流,請參閱「媒體檔案基本概念」一文。

  1. MP4

    /media # ffmpeg -i glocken.mov glocken.mp4
    
  2. WebM

    /media # ffmpeg -i glocken.mov glocken.webm
    

WebM 的建立時間超過 MP4。看到結果時,您看來不出乎意料MP4 壓縮為原始檔案大小的約 83% 時,WebM 低於原始檔案大小的 78%,但可能比原始檔案大小高出許多。實際結果可能會有差異。請務必留意,FFmpeg 4.2.2 將預設影片位元率設為 200k,而在 4.3.2 中則不會設定預設位元率。因此該影片不再是只有4%原始內容。您可以在媒體檔案所在的資料夾中使用 ls -a bash 指令,自行查看這項資訊。

例如:

/media # ls -l
-rw-r--r-- 1 root  root  12080306 Mar 7 12:16 glocken.mov
-rwx------ 1 root  root  10106446 Mar 7 12:33 glocken.mp4
-rwx------ 1 root  root   9503301 Mar 7 18:30 glocken.webm

如要取得極小的檔案,請改為:

/media # ffmpeg -i glocken.mov -b:v 200k glocken.webm
...
frame=  300 fps=3.6 q=0.0 Lsize=     483kB time=00:00:10.01 bitrate= 395.0kbits/s speed=0.121x
video:359kB audio:117kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.356068%
/media # ls -l
-rw-r--r-- 1 root  root  12080306 Mar 7 12:16 glocken.mov
-rwx------ 1 root  root  10106446 Mar 7 12:33 glocken.mp4
-rwx------ 1 root  root    494497 Mar 7 18:45 glocken.webm

檢查作業

如要驗證結果,請使用如「媒體應用程式基本概念」一文所示的 FFmpeg 和 Shaka Packager:

/media # packager input=glocken.mp4 --dump_stream_info
/media # ffmpeg -i glocken.mp4

轉碼器

接下來,轉碼器。如媒體檔案基本概念中所述,轉碼器與容器 (檔案類型) 不同。相同容器類型的兩個檔案可能會存放使用不同轉碼器壓縮的資料。例如 WebM 格式允許使用 VorbisOpus 編碼音訊。如要變更編碼器,我們使用 FFmpeg例如,這個指令會輸出含有 vorbis 音訊轉碼器和 av1 影片轉碼器的 .mkv 檔案。

/media # ffmpeg -i glocken.mov -c:a vorbis -c:v av1 glocken.mkv

在這個範例中,-c:a 旗標和 -c:v 分別用於指定音訊和影片轉碼器。

「媒體轉換」頁面會列出轉換轉碼器所需的指令。下表匯總了 FFmpeg 使用的程式庫,用於執行 WebM 和 MP4 檔案的轉碼器轉換。以下是分別建議用於 DASH 和 HLS 的格式。

影片

編碼器 延伸 媒體庫
av1 WebM、mkv libaom-av1
h264 MP4 libx264
vp9 WebM libvpx-vp9

音訊

編碼器 延伸 媒體庫
亞太地區 MP4 亞太地區
空瓶座 WebM Libopus
Vorbis WebM libvorbis

接下來,我們會說明如何變更新建檔案的位元率