用于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.18
或4.3.6
。
应用必须检查特定播放器和播放器版本是否提供对XML解析的原生支持。
ShakaPlayer版本4.6.18
和4.3.6
目前支持原生XML解析器。
# Shaka播放器
if(global.isNativeXmlParserSupported("shaka", "4.6.18")) {
console.log('平台支持此版本Shaka播放器的原生Xml解析器');
}
nativeParseFromString (manifest, expectedRoot)
必须为shakaPlayer传递以下参数:
manifest:包含已下载清单的ArrayBuffer
。expectedRoot: 已解析XML的预期根元素。
global.nativeParseFromString()
为XML解析提供原生实现,由播放器在注册后调用。
global.nativeParseFromString(manifest, expectedRoot);
必须将此函数设置为原生函数。
unloadNativeXmlParser()
此unloadNativeXmlParser()
函数会卸载原生解析器缓存。在应用使用完播放器后调用它。通常,这是作为播放器的unload()
函数的一部分完成的。
global.unloadNativeXmlParser();
集成变更
Shaka播放器
Shaka播放器4.6.18
和4.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中进行更改:
- 如果尚未定义,请在src/shakaplayer/ShakaPlayer.ts中定义Shaka播放器的名称和版本:
const playerName: string = "shaka";
const playerVersion: string = "4.6.18";
-
或者,您可以定义一个标记来启用和禁用原生XML解析。例如,在步骤5中使用了以下标记来启用原生解析。
static readonly enableNativeXmlParsing = true;
-
导入并安装
DOMParserPolyfill
。import DOMParserPolyfill from '../polyfills/DOMParserPolyfill'; // 安装DOMParser polyfill 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()
,从而通过调用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播放列表解析已禁用`); } …… }
-
在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日