メディアアプリケーションの基本

Derek Herman 氏
Derek Herman
ジョー・メドレー
Joe Medley

メディアを操作するときに、ビットレートや解像度などのメディア ファイルの特性を変更する必要が生じることがよくあります。簡単な開始方法を見つけるのは大変ですこのページでは、使用するツールと、ツールをすばやくインストールする方法について説明します。

まず、2 つの一般的なコマンドライン メディア ユーティリティである Shaka PackagerFFmpeg の基本的な使用方法について説明し、その後でツールを迅速にインストールできるようにします。2 つのアプリケーションに対応する理由どちらも単独でもパワフルで便利ですが、メディアをウェブ用に準備するために必要なことをすべて行うわけではありません。また、メディア変換ページとメディア暗号化ページも作成し、これら 2 つのアプリケーションでのその他の一般的なオペレーションを多数紹介しています。

ファイル操作タスクに使用できるオプションはこれらのアプリケーションだけではありませんが、最も一般的で強力な 2 つのアプリケーションです。その他のオプションには、GUI アプリケーションの MiroHandBrakeVLC があります。また、ZencoderAmazon Elastic EncoderGoogle Transcoder API などのエンコード/コード変換サービスもあります。

シャカ パッケージャー

Shaka Packager は、無料のメディア パッケージ SDK です。サイトでメディア プレーヤーを使用している場合、ファイルの準備には Shaka Packager を使用します。Dynamic Adaptive Streaming over HTTP(DASH)または HTTP Live Streaming(HLS)の 2 つの一般的な動画ストリーミング プロトコルの変換をサポートしています。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 項目があることに注意してください。ここでは示していませんが、1 つのコマンドでファイルの動画ストリームと音声ストリームを個別に操作できます。

この基本的なパターンと、ファイルの特性を表示する簡単な使用方法を比較します。この例では、同等の部分を並べています。

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

メディア ファイルの基本で説明した特性に注目してください。フル 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 の使用が厳密には 正しくないためです私たちが重視する情報を表示するため、Google はこの情報を使用しています。

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 内に docker ディレクトリと media ディレクトリを作成します。これにより、media ディレクトリがビルド コンテキストから除外されます。media はオペレーションを実行する予定のファイルが保存され、一部のファイルは非常に大きくなる可能性があるため、これは重要です。Dockerfilemedia-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 を実際に使ってみたところで、基本コンセプトの学習を続けることができます。次のメディア ストリーミングの基本をご覧ください。