Треки

Аудиодорожки

Для выбора звуковой дорожки пакет SDK Web Receiver предоставляет класс AudioTracksManager , который упрощает и оптимизирует выбор дорожки, предоставляя вам больше контроля и лучший доступ к свойствам, таким как имя, URL-адрес и язык. Этот класс лучше всего использовать в обработчике событий cast.framework.events.EventType.PLAYER_LOAD_COMPLETE .

API предоставляет различные способы запроса и выбора активных аудиодорожек. Вот пример того, как выбрать активный трек, указав его идентификатор:

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. Коды языков могут быть представлены в двухсимвольной номенклатуре (например, «es», «en» или «de») или в четырехсимвольной номенклатуре (например, « 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();

При воспроизведении рекламных пауз любой выбор звуковой дорожки, например язык, сделанный до паузы, сохранится после паузы для того же контента, даже если реклама ведется на другом языке.

Скрытые субтитры (субтитры)

Для выбора трека со скрытыми субтитрами пакет SDK Web Receiver предоставляет класс TextTracksManager , который упрощает и оптимизирует выбор трека, предоставляя вам больше контроля и лучший доступ к свойствам, таким как имя, URL-адрес и язык.

Класс TextTracksManager лучше всего использовать в обработчике события cast.framework.events.EventType.PLAYER_LOAD_COMPLETE .

Выбор субтитров в 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. Коды языков могут быть представлены в двухсимвольной номенклатуре (например, «es», «en» или «de») или в четырехсимвольной номенклатуре (например, «en-us», «es-es» или «fr-ca»).

Если медиа-манифест соответствует другому стандарту языкового кода, приложению Web Receiver необходимо преобразовать все входящие запросы в этот стандарт. В этих запросах, например голосовых командах, используются языковые коды RFC 5646. 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 разделит принудительные и скрытые субтитры. Это означает, что зритель не сможет выбрать принудительную подпись.

Если субтитры включены, принудительные субтитры отключаются, чтобы предотвратить наложение субтитров. Если субтитры отключены и если в манифесте предусмотрены принудительные субтитры, то принудительные субтитры отображаются в зависимости от предпочтений зрителя в отношении языка аудио.