Рекламные паузы
SDK Web Sender обеспечивает поддержку рекламных пауз и сопутствующей рекламы в рамках заданного медиапотока.
Для получения более подробной информации о том, как работают рекламные паузы, см. раздел «Обзор рекламных пауз в Web Receiver» .
Хотя прерывания можно указать как на отправителе, так и на получателе, рекомендуется указывать их на веб-приемнике и приемнике Android TV для обеспечения согласованной работы на разных платформах.
В веб-среде укажите рекламные паузы в команде загрузки, используя BreakClip и Break :
let breakClip1 = new BreakClip('bc0');
breakClip1.title = 'Clip title'
breakClip1.posterUrl = 'https://www.some.url';
breakClip1.duration = 60;
breakClip.whenSKippable = 5;
let breakClip2 = ...
let breakClip3 = ...
let break1 = new Break('b0', ['bc0', 'bc1', 'bc2'], 10);
let mediaInfo = new chrome.cast.media.MediaInfo(<contentId>, '<contentType');
...
mediaInfo.breakClips = [breakClip1, breakClip2, breakClip3];
mediaInfo.breaks = [break1];
let request = new chrome.cast.media.LoadRequest(mediaInfo);
cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request)
Использование API треков
Дорожка может представлять собой текстовый объект (субтитры или подписи) или объект аудио- или видеопотока. API-интерфейсы дорожек позволяют работать с этими объектами в вашем приложении.
Объект Track представляет собой трек в SDK. Вы можете настроить трек и присвоить ему уникальный идентификатор следующим образом:
var englishSubtitle = new chrome.cast.media.Track(1, // track ID
chrome.cast.media.TrackType.TEXT);
englishSubtitle.trackContentId = 'https://some-url/caption_en.vtt';
englishSubtitle.trackContentType = 'text/vtt';
englishSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
englishSubtitle.name = 'English Subtitles';
englishSubtitle.language = 'en-US';
englishSubtitle.customData = null;
var frenchSubtitle = new chrome.cast.media.Track(2, // track ID
chrome.cast.media.TrackType.TEXT);
frenchSubtitle.trackContentId = 'https://some-url/caption_fr.vtt';
frenchSubtitle.trackContentType = 'text/vtt';
frenchSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
frenchSubtitle.name = 'French Subtitles';
frenchSubtitle.language = 'fr';
frenchSubtitle.customData = null;
var frenchAudio = new chrome.cast.media.Track(3, // track ID
chrome.cast.media.TrackType.AUDIO);
frenchAudio.trackContentId = 'trk0001';
frenchAudio.trackContentType = 'audio/mp3';
frenchAudio.subtype = null;
frenchAudio.name = 'French Audio';
frenchAudio.language = 'fr';
frenchAudio.customData = null;
Медиафайл может иметь несколько дорожек; например, он может иметь несколько субтитров (каждый на отдельном языке) или несколько альтернативных аудиопотоков (на разных языках).
MediaInfo — это класс, моделирующий медиафайл. Чтобы связать коллекцию объектов Track с медиафайлом, необходимо обновить свойство tracks . Эта связь должна быть установлена до загрузки медиафайла в приемник:
var tracks = [englishSubtitle, frenchSubtitle, frenchAudio];
var mediaInfo = new chrome.cast.media.MediaInfo(mediaURL);
mediaInfo.contentType = 'video/mp4';
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.customData = null;
mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;
mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
mediaInfo.duration = null;
mediaInfo.tracks = tracks;
Активные дорожки можно задать в запросе activeTrackIds для медиафайлов.
Вы также можете активировать одну или несколько дорожек, связанных с медиафайлом, после его загрузки, вызвав EditTracksInfoRequest(opt_activeTrackIds, opt_textTrackStyle) и передав идентификаторы дорожек, которые нужно активировать, в opt_activeTrackIds . Обратите внимание, что оба параметра являются необязательными, и вы можете выбрать, какие именно — активные дорожки или стили — установить по своему усмотрению. Например, вот как активировать французские субтитры ( 2 ) и французскую аудиодорожку ( 3 ):
var activeTrackIds = [2, 3];
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(activeTrackIds);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
Чтобы удалить все аудио- или видеодорожки из текущего медиафайла, просто установите параметр mediaInfo.tracks=null (пустой массив) и перезагрузите медиафайл.
Чтобы удалить все текстовые дорожки из текущего медиафайла (например, отключить субтитры), выполните одно из следующих действий:
- Обновите
var activeTrackIds = [2, 3];(как показано ранее), чтобы она включала только [3], аудиодорожку. - Установите
mediaInfo.tracks=null. Обратите внимание, что для отключения текстовых субтитров (track.hidden) перезагрузка медиафайлов не требуется. Отправка массиваactiveTracksId, не содержащего ранее включенныйtrackIdотключает текстовую дорожку.
Оформление текстовых дорожек
Объект TextTrackStyle содержит информацию о стиле текстовой дорожки. После создания или обновления существующего объекта TextTrackStyle вы можете применить его к воспроизводимому в данный момент медиафайлу, вызвав метод editTrackInfo следующим образом:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(textTrackStyle);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
Вы можете отслеживать статус запроса по результатам обратных вызовов (успех или ошибка) и соответствующим образом информировать отправителя.
Приложения должны позволять пользователям обновлять стиль текстовых дорожек, используя либо настройки, предоставляемые системой, либо настройки самого приложения.
Вы можете настроить следующие элементы стиля текстовой дорожки:
- Цвет и прозрачность текста (переднего плана)
- Цвет и прозрачность фона
- Тип кромки
- Цвет края
- Масштаб шрифта
- Семейство шрифтов
- Стиль шрифта
Например, установите цвет текста на красный с прозрачностью 75% следующим образом:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
textTrackStyle.foregroundColor = '#80FF0000';
Регулятор громкости
Для регулировки громкости ресивера можно использовать RemotePlayer и RemotePlayerController .
function changeVolume(newVolume) {
player.volumeLevel = newVolume;
playerController.setVolumeLevel();
// Update sender UI to reflect change
}
Приложение отправителя должно придерживаться следующих рекомендаций по регулированию громкости:
- Приложение отправителя должно синхронизироваться с приложением получателя, чтобы пользовательский интерфейс отправителя всегда отображал уровень громкости для получателя. Используйте обратные вызовы
RemotePlayerEventType.VOLUME_LEVEL_CHANGEDиRemotePlayerEventType.IS_MUTED_CHANGEDдля поддержания уровня громкости на устройстве отправителя. Дополнительную информацию см. в разделе «Обновления состояния» . - Приложения отправителя не должны устанавливать уровень громкости на определенном, заранее заданном уровне или устанавливать уровень громкости на уровне громкости звонка/медиа на устройстве отправителя при загрузке приложения на устройстве получателя.
См. раздел «Регуляторы громкости отправителя» в контрольном списке проектирования .
Отправка медиасообщений получателю.
Media Messages могут отправляться от отправителя к получателю. Например, чтобы отправить сообщение SKIP_AD получателю:
// Get a handle to the skip button element
const skipButton = document.getElementById('skip');
skipButton.addEventListener("click", function() {
if (castSession) {
const media = castSession.getMediaSession();
castSession.sendMessage('urn:x-cast:com.google.cast.media', {
type: 'SKIP_AD',
requestId: 1,
mediaSessionId: media.mediaSessionId
});
}
});
Обновления статуса
Когда к одному и тому же приемнику подключено несколько отправителей, важно, чтобы каждый отправитель был в курсе изменений на приемнике, даже если эти изменения были инициированы другими отправителями.
Для этого ваше приложение должно зарегистрировать все необходимые обработчики событий в RemotePlayerController . Если TextTrackStyle текущего медиафайла изменяется, то все подключенные отправители будут уведомлены, и соответствующие свойства текущей медиасессии, такие как activeTrackIds и textTrackStyle поля MediaInfo , будут отправлены отправителям в коллбэках. В этом случае SDK получателя не проверяет, отличается ли новый стиль от предыдущего, и уведомляет всех подключенных отправителей независимо от этого.
Индикатор прогресса
Отображение места воспроизведения с индикатором прогресса на стороне отправителя является обязательным требованием для большинства приложений. API Cast используют протокол Cast Media, который оптимизирует потребление полосы пропускания для этого и других сценариев, поэтому вам не нужно реализовывать собственную синхронизацию состояния. Для корректной реализации индикатора прогресса воспроизведения мультимедиа с использованием API см. пример приложения CastVideos-chrome .
Требования CORS
Для адаптивной потоковой передачи мультимедиа Google Cast требует наличия заголовков CORS, но даже простые потоки mp4-файлов требуют CORS, если они содержат дорожки. Если вы хотите включить дорожки для любого мультимедиа, вы должны включить CORS как для потоков дорожек, так и для потоков мультимедиа. Таким образом, если у вас нет заголовков CORS для простых mp4-файлов на сервере, и вы затем добавите простую дорожку субтитров, вы не сможете транслировать мультимедиа, пока не обновите свой сервер, добавив соответствующие заголовки CORS.
Вам необходимы следующие заголовки: Content-Type , Accept-Encoding и Range . Обратите внимание, что последние два заголовка, Accept-Encoding и Range , являются дополнительными заголовками, которые вам, возможно, ранее не требовались.
Символ подстановки "*" нельзя использовать в заголовке Access-Control-Allow-Origin . Если страница содержит защищенный медиаконтент, вместо символа подстановки необходимо использовать домен.
Возобновление сессии без перезагрузки веб-страницы.
Чтобы возобновить существующую CastSession , используйте requestSessionById(sessionId) с sessionId сессии, к которой вы пытаетесь присоединиться.
Идентификатор sessionId ) можно найти в активной CastSession , используя getSessionId() после вызова loadMedia() .
Рекомендуемый подход заключается в следующем:
- Вызовите функцию
loadMedia()для начала сессии. - Сохраните идентификатор
sessionIdлокально. - При необходимости повторно подключитесь к сессии, используя
requestSessionById(sessionId)
let sessionId;
function rejoinCastSession() {
chrome.cast.requestSessionById(sessionId);
// Add any business logic to load new content or only resume the session
}
document.getElementById('play-button').addEventListener(("click"), function() {
if (sessionId == null) {
let castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (castSession) {
let mediaInfo = createMediaInfo();
let request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request)
sessionId = CastSession.getSessionId();
} else {
console.log("Error: Attempting to play media without a Cast Session");
}
} else {
rejoinCastSession();
}
});
Следующие шаги
На этом завершается описание функций, которые вы можете добавить в свое веб-приложение для отправки сообщений. Теперь вы можете создать приложение для отправки сообщений на другой платформе ( Android или iOS ) или приложение для получения сообщений .