トラック

音声トラック

オーディオ トラックの選択については、Web Receiver SDK に用意されている AudioTracksManager クラスを使用すると、トラックの選択を簡素化して合理化し、名前、URL、言語などのプロパティをより細かく管理できます。このクラスは、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 Receiver アプリはそれを RFC 5646 準拠の言語コードに変換する必要があります。Web Receiver 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 クラスが用意されており、名前、URL、言語などのプロパティをより細かく制御してアクセスできます。

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 文字の命名法(「en」、「en」、「de」など)または 4 文字の命名法(「en-us」、「es-es」、「fr-ca」など)のいずれかで指定できます。

メディア マニフェストが別の言語コード標準に従っている場合、Web Receiver アプリで受信リクエストをその標準に変換する必要があります。これらのリクエスト(音声コマンドなど)では、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();

広告ブレークを通した再生の場合、言語などのテキスト トラックの選択内容は、広告が異なる言語でも、同じコンテンツのブレーク後も保持されます。

強制字幕

自動字幕起こしまたは自動ナラティブは、別の言語が使用されたときや、音声をクリアにしたい場合に、視聴者が理解できるようにテキスト オーバーレイとして表示されます。字幕とは異なり、視聴者は視聴者の音声設定に基づいて自動選択されるため、強制字幕を有効にする必要はありません。

キャスト アプリに自動字幕起こしを追加するには、マニフェストの一部として追加する必要があります。マニフェストで、トラックのロールを forced-subtitle に設定します。Cask SDK がこれらのトラックを検出すると、強制的に字幕を識別します。Cast SDK によって自動字幕起こしと字幕が分離されるため、送信者の作業は必要ありません。つまり、閲覧者は強制字幕を選択できません。

自動字幕起こしを有効にすると、自動字幕起こしは無効になり、字幕の重複を防ぐことができます。字幕がオフで、マニフェストに自動字幕起こし機能が設定されている場合、強制字幕は視聴者の音声の言語設定に基づいて表示されます。