容器和轉碼器

Derek Herman
Derek Herman
Joe Medley
Joe Medley

如要支援多個瀏覽器,您必須使用 FFmpeg 將 .mov 檔案轉換為兩個不同的容器:MP4 容器和 WebM 容器。在實際操作中,您可能會同時指定編解碼。目前,我們讓 FFmpeg 使用預設值。

如果您不熟悉這些概念,請先閱讀媒體檔案基礎知識,再繼續閱讀本文。此外,如果您尚未安裝 FFmpeg,請參閱媒體應用程式基本資訊,瞭解如何透過 Docker 設定 FFmpeg。

我們使用建議的 Docker 安裝程序,並從為網路準備媒體檔案中新增的 glocken.mov 檔案,media我們使用 FFmpeg 4.3.2 版執行本節的所有指令。

首先,我們需要使用 .mp4.webm 檔案副檔名,從 .mov 檔案建立兩個容器,並在檔案中加入音訊和影片串流。如果不清楚容器和串流的差異,請參閱「媒體檔案基礎知識」一文。

  1. MP4

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

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

相較於 MP4,WebM 的建立時間較長。從結果來看,這一點並不令人意外。雖然 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

音訊

轉碼器 擴充功能 媒體庫
aac MP4 aac
opus WebM libopus
vorbis WebM libvorbis

接下來,我們將說明如何變更新建立檔案的比特率