Аудиодорожки
Для выбора звуковой дорожки пакет 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 разделит принудительные и скрытые субтитры. Это означает, что зритель не сможет выбрать принудительную подпись.
Если субтитры включены, принудительные субтитры отключаются, чтобы предотвратить наложение субтитров. Если субтитры отключены и если в манифесте предусмотрены принудительные субтитры, то принудительные субтитры отображаются в зависимости от предпочтений зрителя в отношении языка аудио.