blog heroalche.studio

UE5.3 で進化したメディアサポートと Electra Player

著者:

Riku Ishikawa

投稿日 2023.11.06更新日 2023.11.15

Unreal Engineにおいて、インゲームで動画を利用したい場合、よく使われるプレイヤーの一つがElectra Playerです。これはUEにビルトインされた公式のプラグインです。

Electra Playerは実はUE5.3で大きなアップデートが行われましたが、その内容があまり大々的に取り上げられておらず、公式ドキュメントにも触れられていません。この記事では、ソースコードを元にしてUE5.3以降のElectra Playerについて調査し、知っておくべき情報をまとめてみました。

この記事の要点

  • UE5.3 から、 Electra Player でサポートされるコーデックとコンテナフォーマットが増えた。
  • 対応コーデックはプラグインで追加できるようになった。

前提知識について整理

本題の前に、UE における Media Framework と Player など、前提知識について整理しておきます。

Media Framework

UE には、画像シーケンスや動画、音声などをインゲームで扱うためのシステムとして Media Framework が実装されています。これは、特定のプラットフォームやコーデックに対するものではなく、メッシュのテクスチャや UI の上で、動画などのメディアを利用できるようにする包括的な機能のことを指します。

プレイヤー と Electra Player

Media Framework は動画/音声コーデックなどのサポートを直接持っていないので、実際にメディアファイルを再生するためには、それを実装したプレイヤーと組み合わせる必要があります。 ビルトインのプレイヤーだけでも多数あり、それぞれサポートしているコーデックや、動作するプラットフォームが異なります。

そのため、どのメディアを再生するかと同時に、どのプレイヤーで再生するかというのも、UEにおけるメディア再生における重要な要素です。

MediaFrameworkPlayerPerPlatform

こうしたプレイヤーの一種が、 Electra Player です。他の多くのプレイヤーと異なり、プラットフォームのAPIを利用したものやサードパーティ製のプレイヤーではなく、Unreal Engine 向けに実装されたプレイヤーで、これだけで多数のプラットフォームに対応することが出来ます。ただし、UE5.2 までは対応コーデック/フォーマットが少ないというデメリットがありました。

メディアコンテナとコーデック

これは Unreal Engine の機能ではありませんが、前提知識としてメディアコンテナとコーデックの話もざっくりしておきます。

まず、コンテナフォーマット とはいわゆる .mp4 とか .mkv とかの拡張子のファイルのことです。これは、内部に動画や音声、関係するメタデータを含むファイルのデータの構造の種類を定めたものです。メディアデータ本体ではなく、入れ物の形式を定めたものと言えます。
一方で、コーデックとは、コンテナの内部に入る動画や音声のデータの符号化形式のことです。例としては H.264 / AVC とか AAC とか Vorbis とかがあります。動画や音声のデータそのものを表現する方式であるといえます。

そして、コンテナフォーマット で定義されたファイルの内部に コーデック で定義されたメディアのデータが格納されるのです。ですから、 MP4 というコンテナであっても、中身に入っているメディアの形式であるコーデックは様々です。

UE5.2 までの Electra Player

UE5.2 までの Electra Player で再生可能なファイルフォーマットは MP4 のみで、再生可能な MP4 コンテナ内のコーデックも以下だけでした。

メディア タイプコーデック
ビデオ コーデックH.264 / AVC, H.265 / HEVC (ISO/IEC 14496-10)
オーディオ コーデックAAC (ISO/IEC 14496-3)

これ以外のコーデックを扱いたい場合、プラットフォームごとのサポートを確認しながら、異なるプレイヤーを利用するように設定する必要がありました。 UE5.3 現在でも、公式ドキュメントにはこのような UE5.2 当時の情報が記載されている(というか 5.2 のころから H.265 のことすら書いてなかったりする)ので、注意が必要です。

UE5.3 からの Electra Player

UE5.3 からは、 ElectraPlayer がいくつかのコーデックを追加でサポートするようになりました。さらに、Electra Player がサポートするコーデックを、開発者がプラグインなどとして外部から追加できるようになりました。これにより、以外のコーデックでも、プラットフォームを気にせず Electra Player が利用できる可能性が高まりました。
また、パース可能なコンテナフォーマットも増加しました。以下、具体的な内容について説明します。

コーデックデコーダの分離

UE5.2 までは、ビデオやオーディオのコーデックをデコードするための実装は、 Electra Player プラグインの中の ElectraPlayerRuntime という Electra Player 本体が含まれるモジュールに一緒に含まれていました。

UE5.3 からは、 Electra Codecs という別のプラグインに、コーデックのデコーダの実装が分離されました。また、デコーダは IElectraDecoder というデコーダのインターフェースと IElectraCodecFactory というファクトリのインターフェースによって抽象化されるようになりました。

つまり、 Electra Player で再生できるようにしたいコーデックがあれば、これらのインターフェースを実装する形でデコーダを作成して登録するだけで、様々なコーデックを Electra Player で再生できるようになったのです。

コーデックを追加するために再生制御や同期などの実装を行う必要もなく、シンプルにデコーダ実装のみを行えばいいので、互換性や保守性の向上にも繋がっていそうです。

Electra Player で標準サポートされるようになったコーデック

コーデックデコーダの抽象化に伴い、UE5.3 では Electra Player にいくつかのデコーダが追加されました。追加されたコーデックの多くは、上記のインターフェースを実装したクラスを含むプラグインとしてビルトインされています。 プラグインとして実装されているコーデックも、そのプラグインを有効にしておけば、自動的に Electra Player で再生できるようになります。

コーデックメディアプラットフォームプラグイン名
H.264動画Win64, Android, Mac, iOS, tvOS, LinuxElectra Codecs
H.265動画Win64, Android, Mac, iOS, tvOS, LinuxElectra Codecs
AAC音声Win64, Android, Mac, iOS, tvOS, LinuxElectra Codecs
VP8動画Win64, Mac, LinuxVP8 and VP9 software decoder for Electra
VP9動画Win64, Mac, LinuxVP8 and VP9 software decoder for Electra
Apple ProRes動画Win64, MacApple ProRes Decoder for Electra
Avid DNxHD動画Win64Avid DNxHD® decoder for Electra
HAP動画Win64, MacHAP Decoder for Electra
Opus音声Win64, Mac, iOS, tvOS, Android, LinuxOpus audio decoder for Electra

Electra Player でパース可能になったコンテナフォーマット

コーデック が追加されたこと/追加可能になったことに伴い、コンテナフォーマットのサポートも拡充しました。

コンテナフォーマット
MP4
MOV (QuickTime file format)
MKV (Matroska)
MKA (Matroska)
WebM

MOV は HAP を格納できますし、MKV は WebM のスーパーセットかつどちらも VP8 / VP9 を始め多数のコーデックに対応しています。

ただ残念ながら、 Electra Player の対応コンテナは外部から拡張できそうにありません。これらのパーサーは Electra Player プラグイン内部に直接実装されており、外部から拡張できるようにもなっていなさそうです。とはいえ、 Electra Player プラグインは被依存が少ないプラグインで、プロジェクトで上書きするのは難しくないので、そんなに困りません。

UE5.3 以降の Electra Playerでメディアを再生するときに考えること

こんなにも背後は進化したのですが、基本的な使い方は変わりません。単純に、File Media Source アセットとして WebM, MKV, MOV などの動画を扱い、それを Electra Player で再生できるようになったということです。

コーデック互換の既存プレイヤーとの動作面の差異

VP8 / VP9 など一部のコーデックは、以前から WebM Video Player プラグインなどのビルトインプラグインを利用することで再生することが出来ました。これは、コーデックを追加するのではなく、 Electra Player とは別のプレイヤーを追加することでコーデック対応を行うものでした。

UE5.3 からは Electra Player にコーデックが追加できるようになったわけですが、コーデック互換の別プレイヤーと、Electra Player にコーデックが追加された状態には次のような重要な差異があります。

  1. 同時に再生可能なコーデックにバリエーションをもたせられるかどうか
  2. 再生制御、同期などの処理が同一かどうか

1 は、一つのプレイヤーで多数のコーデックに対応できるかどうかという話です。以前も確かにプレイヤーを切り替えることで複数のコーデックに対応できましたが、逆に言うと、提示されたファイルに応じてプレイヤーを切り替える必要がありました。これからはその必要性が減少します。

2 は、そもそも別プレイヤーと Electra Player では、再生時の挙動に差異がある場合があるという話です。これは実際に Alche 社内で遭遇した問題でした。以前のバージョンで WebM 再生に WebM Video Player を利用していたときに、デコーダではなくプレイヤー実装の問題で音声と映像がズレてしまう問題に悩まされていました。しかし、5.3 以降の Electra Player の機能を使って再生すると、その問題は発生しませんでした。
これはまさに、プレイヤー実装は実績のある Electra Player のものを利用したまま、デコーダ部分だけを拡張する仕組みのメリットであると思われます。個別のプレイヤー固有の不具合などに遭遇する確率を下げることができます。

おわりに

今回はサイレントに進化した Electra Player について詳しく調査してみました。これまでは、 Electra Player は便利だけど対応コーデックとフォーマットが少なかったりするからな……という懸念点がありましたが、これからはよりマルチなプレイヤーとして利用していくことができそうです。また、コーデック部分の拡張性が上がったため、サードパーティから Electra Player にコーデックを追加するプラグインが登場できる余地が広がりました。

最近は Bink Media サポートなども登場していますが、プレイヤー実装の面では不安定だったり扱いにくいケースもあるので、まだまだ進化しそうな Electra Player も見逃さないように追っていきたいところです。