媒體應用程式基本概念

Derek Herman
Derek Herman
Joe Medley
Joe Medley

使用媒體時,通常需要變更媒體檔案的特性,例如位元率或解析度。找到簡單的入門方式 有點令人卻步本頁面將說明慣用的工具,以及如何快速安裝這些工具。

首先,我們會說明兩種常見指令列媒體公用程式的基本用法:Shaka PackagerFFmpeg,接著我們會協助您快速安裝工具。為何要說明兩個應用程式?儘管兩者本身功能強大且實用,但針對網路製作所需的媒體也不一定全都完成。我們也建立了媒體轉換媒體加密頁面,其中介紹了這兩個應用程式較常執行的作業。

這些應用程式並非唯一適用於檔案操縱工作的選項,但卻是最常見且最強大的兩種功能。其他選項包括 GUI 應用程式 MiroHandBrakeVLC。此外,還有 ZencoderAmazon Elastic EncoderGoogle 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,因為這樣可以為您省下大量時間。除此之外,我們還會提供操作說明,協助您快速完成設定。

  1. 首先,在電腦上的某個位置建立名為 media-tools 的新目錄;您可以使用任意名稱,請注意,以下操作說明假設您使用 media-tools 做為目錄名稱。

  2. media-tools 中建立 dockermedia 目錄。這會將 media 目錄排除在建構環境之外。這點非常重要,因為 media 是我們打算執行作業的檔案儲存位置,其中部分檔案可能相當大。如果直接將 Dockerfile 放入 media-tools,那麼在道路重新建構時,建構映像檔會減慢建構速度,也許可以改變安裝的版本。

  3. 建立 /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"]
    
  4. 建構映像檔:

    docker build -t media-tools ./docker
    
  5. 將映像檔做為互動式殼層執行。在 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 -versionpackager --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 的實作方式,現在您可以繼續學習基本概念,請接著說明「媒體串流基本概念」。