as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持

用于DASH内容的XML解析器

用于DASH内容的XML解析器

诸如Shaka播放器和Bitmovin之类的媒体源扩展 (MSE) 播放器在JavaScript中执行CPU密集型任务,例如解析多个Dash媒体清单,这可能会影响用户界面的响应能力和应用程序的流畅度。这种影响在用清单大小较大的大型DVR窗口进行直播TV播放时尤其明显。本文档介绍如何利用XML解析器的原生实现来优化性能。

实现XML解析

您可以使用以下函数将XML解析工作卸载到原生解析器。

registerNativePlayerUtils()

要使用原生解析,应用必须注册原生函数。registerNativePlayerUtils() 函数注册应用并允许其调用原生XML解析器。如果当前平台支持原生解析,则该函数返回true,否则返回false。

已复制到剪贴板。

global.registerNativePlayerUtils();

boolean isNativeXmlParserSupported(playerName: string, playerVersion: string)

playerName: 指定播放器的名称。支持的值为“shaka”。playerVersion: 播放器的版本。对于Shaka播放器而言,提供支持的版本为4.6.184.3.6

应用必须检查特定播放器和播放器版本是否提供对XML解析的原生支持。

ShakaPlayer版本4.6.184.3.6目前支持原生XML解析器。

已复制到剪贴板。

# Shaka播放器
if(global.isNativeXmlParserSupported("shaka", "4.6.18")) {
    console.log('平台支持此版本Shaka播放器的原生Xml解析器');
}

nativeParseFromString (manifest, expectedRoot)

必须为shakaPlayer传递以下参数:

manifest:包含已下载清单的ArrayBufferexpectedRoot: 已解析XML的预期根元素。

global.nativeParseFromString() 为XML解析提供原生实现,由播放器在注册后调用。

已复制到剪贴板。

global.nativeParseFromString(manifest, expectedRoot);

必须将此函数设置为原生函数。

unloadNativeXmlParser()

unloadNativeXmlParser() 函数会卸载原生解析器缓存。在应用使用完播放器后调用它。通常,这是作为播放器的unload() 函数的一部分完成的。

已复制到剪贴板。

global.unloadNativeXmlParser();

集成变更

Shaka播放器

Shaka播放器4.6.184.3.6版本支持原生XML解析器。有关在应用中使用Shaka播放器并应用所有必需补丁的信息,请参阅使用Shaka播放器播放自适应内容 (HLS/DASH)

要成功集成XML解析器,请执行以下操作:

  • 确保Shaka播放器内部版本中有Shaka-Player-changes-for-Dash-nativization.patch,其让挂钩能够注册XML解析函数。
  • 作为原生化版本发布的一部分,我们还添加了一个polyfill: DOMParserPolyfill。确保将DOMParserPolyfill.ts选作应用polyfill的一部分。
  • 确保将MiscPolyfill.ts文件的更新版本选作应用polyfill的一部分。此polyfill进行了更新,以消除对基本DomParser对象的依赖。

这些更改添加到了从以下版本开始的Shaka播放器:

  • 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播放器的名称和版本:

已复制到剪贴板。

  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 polyfill
     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(),从而通过调用nativeParseFromString() 将实现从Shakaplayer传递给原生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日