轨道

曲目

对于音轨选择,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 将强制分离字幕,因此您无需对发送者执行任何操作。这意味着,观看者将无法选择强制字幕。

启用字幕后,系统会停用强制字幕,以防止字幕重叠。关闭字幕后,如果清单中提供强制字幕功能,系统会根据观看者的音频语言偏好设置显示强制字幕功能。