曲目
对于音轨选择,Web Receiver SDK 提供了一个 AudioTracksManager
类,该类可以简化并简化轨道选择,让您更好地控制以及更好地了解名称、网址和语言等属性。此类最适合用于 cast.framework.events.EventType.PLAYER_LOAD_COMPLETE
事件的事件处理脚本。
该 API 提供了多种查询和选择有效音轨的方法。以下示例说明了如何通过指定曲目 ID 将其激活:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
const audioTracksManager = playerManager.getAudioTracksManager();
// Get all audio tracks
const tracks = audioTracksManager.getTracks();
// Choose the first audio track to be active by specifying its ID
audioTracksManager.setActiveById(tracks[0].trackId);
});
context.start();
AudioTracksManager
类还提供了 getActiveTrack()
方法。
以下示例说明了如何为指定语言选择第一个音轨(在本例中为英语):
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
const audioTracksManager = playerManager.getAudioTracksManager();
// Set the first matching language audio track to be active
audioTracksManager.setActiveByLanguage('en');
});
context.start();
AudioTracksManager
类还提供了 getTracksByLanguage(language)
方法,该方法会返回指定语言的所有曲目。
系统会从媒体清单中检索音频语言代码,并应遵循 RFC 5646 标准。语言代码可以采用 2 个字符的命名法(例如“es”、“en”或“de”),或 4 个字符的命名法(例如“en-us”、“es-es”或“fr-ca”)。
如果媒体清单遵循其他语言代码标准,则 Web 接收器应用需要将其转换为符合 RFC 5646 标准的语言代码。Web 接收器 SDK 提供了一个拦截器 EDIT_AUDIO_TRACKS
来执行修改:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// Intercept the EDIT_AUDIO_TRACKS request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.EDIT_AUDIO_TRACKS, request => {
// write logic to convert language codes here
});
context.start();
当通过广告插播时间点播放时,在插播时间点之前对音轨所做的任何音轨选择(例如语言)都将保留,即使广告使用其他语言也是如此。
字幕
对于字幕轨道选择功能,Web Receiver SDK 提供了 TextTracksManager
类,用于简化并简化轨道选择过程,便于您更好地控制和访问名称、网址和语言等属性。
TextTracksManager
类最适合用于 cast.framework.events.EventType.PLAYER_LOAD_COMPLETE
事件的事件处理脚本。
使用 SDK 接收器的 SDK 简化了其他部分,简化了字幕选择流程。
该 API 支持控制 WebVTT、TTML 和 CEA-608。
TextTracksManager
类提供了查询和选择处于活动状态的字幕轨道的各种方法。以下示例展示了如何通过指定第一个曲目的 ID 将其激活:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
const textTracksManager = playerManager.getTextTracksManager();
// Get all text tracks
const tracks = textTracksManager.getTracks();
// Choose the first text track to be active by its ID
textTracksManager.setActiveByIds([tracks[0].trackId]);
});
context.start();
TextTracksManager
类还提供了 getActiveTracks()
方法。
以下示例说明了如何为特定语言选择第一个文本轨道:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
const textTracksManager = playerManager.getTextTracksManager();
// Set the first matching language text track to be active
textTracksManager.setActiveByLanguage('en');
});
context.start();
TextTracksManager
类还提供了 getTracksByLanguage(language)
方法,该方法会返回指定语言的所有曲目。
从媒体清单中检索到文本语言代码,并且应遵循 RFC 5646 标准。语言代码可以采用 2 个字符的命名法(例如“es”、“en”或“de”),或由 4 个字符组成的命名法(例如“en-us”、“es-es”或“fr-ca”)。
如果媒体清单遵循其他语言代码标准,则 Web 接收器应用需要将任何传入请求转换为该标准。这些请求(例如语音指令)使用 RFC 5646 语言代码。Web Receiver SDK 会提供拦截器 EDIT_TRACKS_INFO
,以将请求转换为清单的标准:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// intercept the EDIT_TRACKS_INFO request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.EDIT_TRACKS_INFO, request => {
// write logic to convert language codes here
});
context.start();
借助该 API,开发者可以动态添加新的字幕轨道(在本例中针对不同的语言和带外轨道),并选择一个轨道作为新的有效轨道:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
// Create text tracks object
const textTracksManager = playerManager.getTextTracksManager();
// Create track 1 for English text
const track1 = textTracksManager.createTrack();
track1.trackContentType = 'text/vtt';
track1.trackContentId = 'http://example.com/en.vtt';
track1.language = 'en';
// Create track 2 for Spanish text
const track2 = textTracksManager.createTrack();
const track2Id = track2.trackId;
track2.trackContentType = 'text/vtt';
track2.trackContentId = 'http://example.com/spa.vtt';
track2.language = 'spa';
// Add tracks
textTracksManager.addTracks([track1, track2]);
// Set the first matching language text track to be active
textTracksManager.setActiveByLanguage('en');
});
context.start();
通过广告插播时间点播放时,在广告插播时间点之前所做的任何文本轨道选择(例如语言)都将在相同内容结束后保持不变,即使广告采用的是其他语言。
强制字幕
强制字幕或强制叙述是显示的文字叠加层,以便观看者了解何时使用替代语言或澄清音频。与字幕不同,观看者无需启用强制字幕,因为系统会根据观看者的音频偏好设置自动选择字幕。
如需向 Cast 应用添加强制字幕,您需要将其添加到清单中。在清单中,将轨道的角色设置为 forced-subtitle
。Cask SDK 提取这些音轨时,会将其标识为强制字幕。Cast SDK 将强制分离字幕,因此您无需对发送者执行任何操作。这意味着,观看者将无法选择强制字幕。
启用字幕后,系统会停用强制字幕,以防止字幕重叠。关闭字幕后,如果清单中提供强制字幕功能,系统会根据观看者的音频语言偏好设置显示强制字幕功能。