as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

DASHコンテンツ用のXMLパーサー

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.184.3.6を対象にサポートされています。

クリップボードにコピーしました。

#Shaka Player
if(global.isNativeXmlParserSupported("shaka", "4.6.18")) {
    console.log('プラットフォームは、このバージョンのShaka PlayerでネイティブXMLパーサーをサポートしています');
}

nativeParseFromString(manifest, expectedRoot)

ShakaPlayerでは次の引数を渡す必要があります。

manifest:ダウンロードされたマニフェストを格納するArrayBufferexpectedRoot: 解析されたXMLで想定されるルート要素。

global.nativeParseFromString()は、XML解析のネイティブ実装を提供し、登録後にプレーヤーによって呼び出されます。

クリップボードにコピーしました。

global.nativeParseFromString(manifest, expectedRoot);

この関数はネイティブ関数として設定する必要があります。

unloadNativeXmlParser()

unloadNativeXmlParser()関数は、ネイティブパーサーのキャッシュの読み込みを解除します。アプリがプレーヤーを使い終わったときに呼び出します。通常、これはプレーヤーのunload()関数の一部として実行されます。

クリップボードにコピーしました。

global.unloadNativeXmlParser();

統合の変更

Shaka Player

ネイティブXMLパーサーは、Shaka Playerのバージョン4.6.184.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に以下の変更を加える必要があります。

  1. src/shakaplayer/ShakaPlayer.tsで、Shaka Playerの名前とバージョンがまだ定義されていない場合は定義します。

クリップボードにコピーしました。

  const playerName: string = "shaka";
  const playerVersion: string = "4.6.18";
  1. 必要に応じて、ネイティブXML解析を有効または無効にするフラグを定義できます。たとえば、次のフラグは手順5でネイティブ解析を有効にするために使用されます。

    クリップボードにコピーしました。

     static readonly enableNativeXmlParsing = true;
    
  2. DOMParserPolyfillをインポートしてインストールします。

    クリップボードにコピーしました。

     import DOMParserPolyfill from '../polyfills/DOMParserPolyfill';
    
     // DOMParserポリフィルをインストールします。
     DOMParserPolyfill.install();
    
  3. 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;
         }
    
    
  4. 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プレイリスト解析が無効になっています`);
         }
         ....  
       }
    
  5. 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日