曲目

音轨

对于音轨选择,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 标准的语言代码。网络 接收器 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 事件。

简化了 Web Receiver SDK 中的字幕选择流程 SDK 的其他部分

该 API 支持控制 WebVTT、TTML 和 CEA-608。

TextTracksManager 类提供了各种方式来查询和选择已关闭 才能激活字幕轨道。以下示例展示了如何选择第一首曲目 使其变为有效状态:

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 接收器 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 会 来区分强制字幕和可选字幕这意味着,观看者不会 就可以选择强制字幕

启用字幕后,系统会停用强制字幕 图片说明重叠何时关闭字幕以及强制显示字幕 则根据视频字幕, 观看者的音频语言偏好设置