DASHコンテンツ用のXMLパーサー
Shaka PlayerやBitmovinなどのMedia Source Extension(MSE)プレーヤーでは、複数のDashメディアマニフェストの解析など、CPU負荷の高いタスクがJavaScriptで実行されます。このため、UIの応答性やアプリの滑らかさに影響が及ぶことがあります。この影響は、大きいDVRウィンドウで、マニフェストサイズの大きいライブTVを再生している場合に特に顕著に現れます。このドキュメントでは、XMLパーサーのネイティブ実装を利用してパフォーマンスを最適化する方法について説明します。
XML解析の実装
以下の関数を使用すると、XMLの解析をネイティブパーサーにオフロードできます。
registerNativePlayerUtils()
ネイティブ解析を使用するには、アプリでネイティブ関数を登録する必要があります。registerNativePlayerUtils()関数はアプリを登録し、アプリからネイティブXMLパーサーを呼び出せるようにします。この関数は、現在のプラットフォームがネイティブ解析をサポートしていればtrueを返し、それ以外の場合はfalseを返します。
global.registerNativePlayerUtils();
boolean isNativeXmlParserSupported(playerName: string, playerVersion: string)
playerName: プレーヤーの名前を指定します。サポートされている値は"shaka"です。playerVersion: プレーヤーのバージョン。Shaka Playerの場合、サポートされているバージョンは4.6.18または4.3.6です。
アプリでは、特定のプレーヤーとプレーヤーバージョンでXML解析のネイティブサポートが利用できるかどうかを確認する必要があります。
ネイティブXMLパーサーは現在、ShakaPlayerバージョン4.6.18と4.3.6を対象にサポートされています。
#Shaka Player
if(global.isNativeXmlParserSupported("shaka", "4.6.18")) {
console.log('プラットフォームは、このバージョンのShaka PlayerでネイティブXMLパーサーをサポートしています');
}
nativeParseFromString(manifest, expectedRoot)
ShakaPlayerでは次の引数を渡す必要があります。
manifest:ダウンロードされたマニフェストを格納するArrayBuffer。expectedRoot: 解析されたXMLで想定されるルート要素。
global.nativeParseFromString()は、XML解析のネイティブ実装を提供し、登録後にプレーヤーによって呼び出されます。
global.nativeParseFromString(manifest, expectedRoot);
この関数はネイティブ関数として設定する必要があります。
unloadNativeXmlParser()
unloadNativeXmlParser()関数は、ネイティブパーサーのキャッシュの読み込みを解除します。アプリがプレーヤーを使い終わったときに呼び出します。通常、これはプレーヤーのunload()関数の一部として実行されます。
global.unloadNativeXmlParser();
統合の変更
Shaka Player
ネイティブXMLパーサーは、Shaka Playerのバージョン4.6.18と4.3.6を対象にサポートされています。Shaka Playerに必要なすべてのパッチを適用し、それをアプリ内で使用する方法については、Shaka Playerを使用したアダプティブコンテンツ(HLS/DASH)の再生を参照してください。
XMLパーサーを正常に統合するには、次の点を確認する必要があります。
- Shaka PlayerのビルドにShaka-Player-changes-for-Dash-nativization.patchが適用されていることを確認します。これにより、XML解析関数を登録するフックが有効になります。
- ネイティブ化のリリースドロップの一部として、
DOMParserPolyfillというポリフィルの追加も行われています。DOMParserPolyfill.tsがアプリのポリフィルの一部として含まれていることを確認します。 - MiscPolyfill.tsファイルの更新されたリリースが、アプリのポリフィルの一部として含まれていることを確認します。このポリフィルは、基底の
DomParserオブジェクトへの依存を削除するように更新されています。
これらの変更は、Shaka Playerの以下のバージョンから導入されています。
- ShakaPlayer v4.6.18: shaka-rel-v4.6.18-r2.11.tar.gz
- ShakaPlayer v4.3.6: shaka-rel-v4.3.6-r2.4.tar.gz
アプリでは、src/shakaplayer/ShakaPlayer.tsに以下の変更を加える必要があります。
- src/shakaplayer/ShakaPlayer.tsで、Shaka Playerの名前とバージョンがまだ定義されていない場合は定義します。
const playerName: string = "shaka";
const playerVersion: string = "4.6.18";
-
必要に応じて、ネイティブXML解析を有効または無効にするフラグを定義できます。たとえば、次のフラグは手順5でネイティブ解析を有効にするために使用されます。
static readonly enableNativeXmlParsing = true; -
DOMParserPolyfillをインポートしてインストールします。import DOMParserPolyfill from '../polyfills/DOMParserPolyfill'; // DOMParserポリフィルをインストールします。 DOMParserPolyfill.install(); -
nativeParseFromString()を呼び出します。nativeParseFromString(manifest: ArrayBuffer, expectedRoot: string) :Array<shaka.hls.Playlist> { console.log('shaka:nativeParseFromString+'); console.log('shaka:nativeParseFromString:expectedRoot ', expectedRoot); const playlist = global.nativeParseFromString(manifest, expectedRoot); console.log('shaka:nativeParseFromString-'); return playlist; } -
ShakaPlayer.tsファイルに
load()関数を追加して、ネイティブのXML解析に必要な機能が利用可能かどうかを確認します。すべてのチェックに成功したら、setNativeFunctions()を呼び出して、ShakaPlayerからnativeParseFromString()の実装をネイティブXMLパーサーに渡します。setNativeFunctions()は、引数として、XMLの解析中にShakaPlayerによって呼び出される関数を受け取ります。load(content: any, autoplay: boolean): void { .... // load()に以下のコードスニペットを追加します。 if (ShakaPlayer.enableNativeXmlParsing) { // Dashコンテンツ用。 if (global.registerNativePlayerUtils && shaka.util.XmlUtils.setNativeFunctions) { if (!global.isNativeXmlParserSupported) { console.log("shaka:isNativeXmlParserSupportedが登録されていません。"); } if (global.isNativeXmlParserSupported && global.nativeParseFromString) { const isNativeXmlParserSupported = global.isNativeXmlParserSupported(playerName, playerVersion); if (isNativeXmlParserSupported) { console.log('shaka:DASHネイティブ関数を設定します'); shaka.util.XmlUtils.setNativeFunctions(this.nativeParseFromString); } else { console.log('shaka:nativeXMLParserはこのプレーヤーバージョンではサポートされていません'); } } else { console.log('shaka:登録後、ネイティブ関数が設定されていません。スキップします'); } } else { console.log(`shakaplayer: DASHのネイティブへのオフロードが有効になっていません。 registerNativePlayerUtils: ${!!global.registerNativePlayerUtils}, DASH::setNativeFunctions: ${!!shaka.util.XmlUtils.setNativeFunctions}`); } } else { console.log(`shaka:ネイティブのXmlプレイリスト解析が無効になっています`); } .... } -
ShakaPlayer.tsファイルに
unload()関数を追加して、ネイティブのXML解析が有効になっているかどうかを確認します。有効になっている場合は、unloadNativeXmlParserを呼び出してパーサーの読み込みを解除します。unload() : void { .... // 以下のコードスニペットをunload()に追加します。 if (ShakaPlayer.enableNativeXmlParsing && global.isNativeXmlParserSupported && global.nativeParseFromString && global.unloadNativeXmlParser) { const isNativeXmlParserSupported = global.isNativeXmlParserSupported(playerName, playerVersion); if (isNativeXmlParserSupported) { console.log('shakaplayer:ネイティブXmlパーサーの読み込みを解除します'); global.unloadNativeXmlParser(); console.log('shakaplayer:ネイティブXmlパーサーの読み込みを解除しました'); } } .... }
外部リリースのtarballに含まれているShakaPlayer.tsソースファイルには、これらの変更が参考として追加されています。
Last updated: 2025年9月30日

