處理媒體通常需要變更媒體檔案的特性,例如位元率或解析度。找到能直接踏出第一步的方法 可能會讓人感到困難重重在這個頁面中,您將瞭解使用的工具及如何快速安裝。
首先,我們將說明兩個常見的指令列媒體公用程式的基本用法:Shaka Packager 和 FFmpeg,接著協助您快速安裝工具。為什麼要涵蓋兩個應用程式?雖然兩者都強大且實用 但並非萬事俱備,無法準備為網路使用媒體。我們也建立了媒體轉換和媒體加密頁面,其中顯示了這兩個應用程式的許多常見作業。
這些應用程式並非唯一可用於檔案操控工作的選項,但是最常見且最強大的兩個選項。其他選項包括 GUI 應用程式 Miro、HandBrake 和 VLC。另外也有編碼/轉碼服務,例如 Zencoder、Amazon Elastic Encoder 和 Google Transcoder API。
沙卡裝配器
Shaka Packager 是免費的媒體封裝 SDK,如果您在網站上使用媒體播放器,則必須使用 Shaka Packager 來準備檔案。它支援兩種最常見的影片串流通訊協定轉換:透過 HTTP 的動態自動調整串流 (DASH) 或 HTTP 即時串流 (HLS)。Shaka Packager 支援主要的安全性功能:常見加密和 Widevine 數位權利管理 (DRM)。還能處理直播和隨選影片。
儘管套件上列載的內容,這個公用程式仍適用於超過 C++ 開發人員。您可用它做為建構媒體軟體的程式庫,也可以做為指令列公用程式,用來準備網路播放的媒體檔案。對我們來說是第二個有用的容量。事實上,對網頁媒體創作者來說,Shaka Packager 是執行某些工作的唯一方法,而不付費購買昂貴的商業應用程式。
以下是 Shaka Packager 指令的基本模式:
packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]
輸入 packager -help
時,這裡顯示的內容可能不太一樣。此範例較容易理解,也反映了 Shaka Packager 說明文件中的範例。請注意,模式中有多個 stream_descriptor
項目。雖然我們不會顯示這個程式碼,但您可以在單一指令中單獨操控檔案的影片和音訊串流。
比較此基本模式,以及呈現檔案特性的簡單使用方式。在這個範例中,我們排列的是對等的部分。
packager stream_descriptor [stream_descriptor-n] [flags]
packager input=glocken.mp4 --dump_stream_info
指令會輸出以下內容:
File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
codec_string: avc1.640028
time_scale: 30000
duration: 300300 (10.0 seconds)
is_encrypted: false
codec: H264
width: 1920
height: 1080
pixel_aspect_ratio: 1:1
trick_play_factor: 0
nalu_length_size: 4
Stream [1] type: Audio
codec_string: mp4a.40.2
time_scale: 48000
duration: 481280 (10.0 seconds)
is_encrypted: false
codec: AAC
sample_bits: 16
num_channels: 2
sampling_frequency: 48000
language: eng
seek_preroll_ns: 20833
查看「媒體檔案基本概念」一文中討論的特性,並留意幾件事。Full HD 高畫質的高度與寬度是正確的,音訊和視訊轉碼器是其容器類型的偏好轉碼器:音訊 AAC 和 H264。另請注意,串流是以數字標示。這些作業對於單獨操控音訊和影片的作業十分實用。
請注意,上述的輸出內容不會顯示位元率。儘管缺少的內容,這個輸出內容還是更容易閱讀,因此我們會盡可能加以使用。當需要 Shaka Packager 無法取得的資訊 (例如位元率) 時,會使用 FFmpeg。
FFmpeg
FFmpeg 也是用於記錄、轉換及串流媒體檔案的免費應用程式。其功能不如 Shaka Packager 的更好或更糟。相差甚遠。
FFmpeg 指令的基本模式如下所示:
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
如同 Shaka Packager,此應用程式可處理多個串流。其中部分選項會用於多個位置,並根據檔案在指令中的位置,以不同方式操控檔案輸出內容。當您查看 Stack Overflow 上的 FFmpeg 問題及類似網站時,請特別留意這一點。
我們會再比較基本模式與顯示檔案特性的範例。
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
ffmpeg -i glocken.mp4
除了我們要求的資訊以外,這也會顯示錯誤訊息,如以下範例所示。這是因為 FFmpeg 在技術上並不容易我們會使用這些資料,因為這項服務會顯示我們重視的資訊。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.17.100
Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
透過 Docker 安裝應用程式
如果您打算按照步驟操作並嘗試執行指令,可以手動安裝必要工具,也可以採用簡易的路徑並使用 Docker。建議您使用 Docker,因為可以節省大量時間。此外,我們還會提供可協助您快速設定的操作說明。
首先,在電腦中建立名為
media-tools
的新目錄;您可以任意使用任何名稱,但請注意,下列操作說明假設您是以media-tools
做為目錄名稱。在
media-tools
內部建立docker
和media
目錄。 這會將您的media
目錄移出建構結構定義。這點很重要,因為我們打算對media
執行操作的檔案儲存位置,其中有些檔案可能相當龐大。如果將Dockerfile
直接放在media-tools
中,又在道路重建時,建構速度會變慢,可能變更安裝的版本。建立
/media-tools/docker/Dockerfile
,然後新增下列建構操作說明:FROM google/shaka-packager:release-v2.4.3 as packager FROM jrottenberg/ffmpeg:4.3.2-alpine38 COPY --from=packager /usr/bin /usr/bin ENTRYPOINT ["sh"]
建構映像檔:
docker build -t media-tools ./docker
以互動式殼層執行映像檔。在 Linux 上執行下列操作:
docker run -w /media -v ${PWD}/media:/media -it --rm media-tools /media #
Windows:
docker run -w /media -v %cd%/media:/media -it --rm media-tools /media #
執行映像檔時,您可以執行 ffmpeg -version
和 packager --version
檢查 FFmpeg 和 Shaka Packager 的版本,確認一切是否成功。輸出內容應如下所示:
/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release
您現在已嘗試過使用 Shaka Packager 和 FFmpeg 的各項功能,可以繼續學習基本概念,接下來請看「媒體串流基本概念」一節。