軌道

音軌

針對音軌選取功能,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」)。

如果媒體資訊清單遵循不同的語言代碼標準,則網路接收器應用程式必須將其轉換成符合 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 事件的事件處理常式。

在 Web Receiver 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」)。

如果媒體資訊清單遵循不同的語言代碼標準,則網路接收器應用程式必須將任何傳入要求轉換為該標準。這些要求 (例如語音指令) 會使用 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 擷取這些音軌時,會將其視為強製字幕。由於 SDK SDK 會分開處理強製字幕和隱藏式輔助字幕,因此您不需要使用任何工具。這表示觀眾無法選取強製字幕。

啟用隱藏式輔助字幕時,系統會停用強製字幕功能,以免字幕遭到重疊。關閉字幕後,如果在資訊清單中提供強製字幕,系統會根據觀眾的音訊語言偏好設定顯示強製字幕。