Треки

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

Для выбора звуковой дорожки пакет SDK Web Receiver предоставляет класс 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();

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

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

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

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

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

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