W3C媒体功能
媒体功能API提供关键功能,可帮助播放器更好地决定如何处理媒体,并确定媒体的处理效果。此API取代并改进了MediaSource方法、isTypeSupported() 方法、HTMLMediaElement方法和canPlayType() 方法。使用此API的播放器可以做出明智决定,并确保不将高动态范围 (HDR) 内容传送到标准动态范围 (SDR) 屏幕。
万维网联盟 (W3C) 规范定义了decodingInfo方法(仅提供英文版),该方法允许您查询用户代理以确定音频和视频解码能力。该方法指明是否支持该配置,以及预期播放是否流畅和/或节能。
在开始播放之前,类似Shaka的JavaScript播放器依靠decodingInfo()
方法来检测设备的媒体功能。在这种情况下,应用程序可以安装polyfill来获取decodingInfo()
方法的Vega实现,并让播放器做出相应决定。有关如何安装polyfill的更多信息,请参阅安装和设置W3C媒体功能部分。
W3C媒体功能先决条件
该功能在作为Vega SDK的一部分提供的W3C API中实现。应用必须将此API作为依赖项添加到其package.json中才能获得所需的导入。
安装和设置W3C媒体功能
- 设置媒体播放器项目。
- 按照如何使用W3C媒体功能部分中所示安装polyfill。
如何使用W3C媒体功能
使用Shaka播放器的应用
对于使用Shaka播放器的应用,作为Shaka播放器版本的一部分提供了polyfill。有关适用于Vega的Shaka播放器版本的更多信息,请参阅使用Shaka播放器播放自适应内容 (HLS/DASH)。
这个polyfill通过导航器提供了decodingInfo()
方法。Shaka播放器在提供实现时在内部使用此decodingInfo() 方法。要在不进行任何额外代码更改的情况下应用新实现来进行更新,请更新Shaka播放器dist文件夹。
所用JavaScript播放器会在内部使用decodingInfo()
的应用。
使用其他需要实现decodingInfo()
的播放器的应用必须手动安装polyfill。
import {
decodingInfo as decodingInfoImpl,
} from '@amazon-devices/react-native-w3cmedia';
class W3CMediaPolyfill {
static install() {
global.navigator.mediaCapabilities = ({});
global.navigator.mediaCapabilities.decodingInfo = decodingInfoImpl;
}
}
export default W3CMediaPolyfill;
// 调用W3CMediaPolyfill.install();来安装polyfill。
请注意,关于HLS.js和DASH.js播放器如何使用decodingInfo()
方法有一些注意事项。有关更多信息,请参阅常见问题解答部分。
使用不依赖于decodingInfo()
的JavaScript播放器的应用。
Theo和Bitmovin之类的播放器使用canPlayType或isTypeSupported而不是decodingInfo()。如果应用程序满足相同方法的要求,它们可以继续使用这些方法,也可以在播放器外部调用MediaCapabilities API并使用相应信息开始播放。
import {
decodingInfo as decodingInfoImpl,
} from '@amazon-devices/react-native-w3cmedia';
const contentType = 'video/mp4;codecs=avc1.640028';
const configuration = {
type: 'media-source',
video: {
contentType: contentType,
width: 640,
height: 360,
bitrate: 2000, // 应该以bps为单位
framerate: 29.97
}
};
decodingInfoImpl(configuration)
.then((result) => {
console.log('解码' + contentType + '是'
+ (result.supported ? '' : '不') + '受支持的,'
+ (result.smooth ? '' : '不') + '流畅并且'
+ (result.powerEfficient ? '' : '不') + '节能');
})
.catch((err) => {
console.error(err, '导致decodingInfo拒绝');
});
常见问题解答
如何检查Dolby支持?
decodingInfo()
和isTypeSupported()
方法的Vega实现还考虑了连接的电视或AVR的功能,并相应地返回结果。以下代码示例示出了为了使用decodingInfo()
方法检查Dolby支持而可以发送的最低配置。
import {
decodingInfo as decodingInfoImpl,
} from '@amazon-devices/react-native-w3cmedia';
const contentType = 'audio/mp4;codecs=ec-3';
const configuration = {
type: 'media-source',
audio: {
contentType: contentType,
channels: 5.1.1,
sampleRate: 48000,
}
};
decodingInfoImpl(configuration)
.then((result) => {
console.log('解码' + contentType + '是'
+ (result.supported ? '' : '不') + '受支持的,'
+ (result.smooth ? '' : '不') + '流畅并且'
+ (result.powerEfficient ? '' : '不') + '节能');
})
.catch((err) => {
console.error(err, '导致decodingInfo拒绝');
});
检查HDR支持的最低配置是什么?
与Dolby支持类似,您可以使用Vega实现来检查连接的电视或显示器是否支持HDR。
import {
decodingInfo as decodingInfoImpl,
} from '@amazon-devices/react-native-w3cmedia';
// 必须使用有效的编解码器参数。
const contentType = 'video/webm;codecs=vp09.2.10.10.0.9.16.10.1';// 配置文件2,级别1,10位深度,BT2020
const configuration = {
type: 'media-source',
video: {
contentType: contentType,
width: 640,
height: 360,
bitrate: 2000, // 应该以bps为单位
framerate: 29.97,
hdrMetadataType: "smpteSt2086" // 适用于HDR10,而smpteSt2094-40适用于HDR10+
}
};
decodingInfoImpl(configuration)
.then((result) => {
console.log('解码' + contentType + '是'
+ (result.supported ? '' : '不') + '受支持的,'
+ (result.smooth ? '' : '不') + '流畅并且'
+ (result.powerEfficient ? '' : '不') + '节能');
})
.catch((err) => {
console.error(err, '导致decodingInfo拒绝');
});
如何在Dash.js上启用decodingInfo()
?
应用需要安装polyfill才能向Dash.js播放器提供decodingInfo()
的Vega实现。Dash.js播放器的4.0.0版本中引入了对MediaCapabilities API的支持。
注意: 要使用decodingInfo()
方法而不是isTypeSupported()
方法,请确保将useMediaCapabilitiesApi
设置为true。
如何在HLS.js播放器上启用?
应用需要安装polyfill才能向HLS.js播放器提供decodingInfo()
的Vega实现。对MediaCapabilities的支持是在1.5.0-alpha版本(仅提供英文版)中引入的。
确保在HlsConfig中启用useMediaCapabilities。
注意: HLS.js播放器仅在GitHub上HLS.js存储库中mediacapabilities-helper.ts源文件里提到的特定场景中使用decodingInfo()
方法。
W3C媒体功能故障排除
API依赖MIME类型的“编解码器”参数来检测配置文件、级别、编解码器类型等。如果出现错误,请检查该值是否已正确传递。
当播放器无法检测到MIME类型时,它们可能会传递无效的MIME(不符合MIME标准)。即使设备支持实际内容,这也会导致错误。
相关主题
Last updated: 2025年9月30日