Cast SDK включает встроенные API для поддержки живого контента. Это включает в себя гибкий готовый пользовательский интерфейс в сочетании с API-интерфейсами, которые позволяют разработчикам создавать насыщенные живые приложения всего несколькими строками кода. Live API поддерживает отображение времени начала и окончания, метаданных программы, элементов управления DVR и окон с возможностью поиска.
В этом руководстве показано, как настроить поток для Live API, включая примеры кода и метаданных для настройки основных сценариев Live, а также снимки экрана, демонстрирующие, как выглядит каждый сценарий.
Предпосылки
Перед изучением этого руководства необходимо ознакомиться с основами реализации веб-приемника . Кроме того, для запуска примеров кода вам потребуется доступ к прямой трансляции, которая соответствует одному из поддерживаемых типов мультимедиа для Cast . Как правило, функция Live поддерживает типичные конфигурации прямых трансляций для поддерживаемых медиафайлов .
В руководстве используются следующие термины:
- Окно поиска — диапазон прямой трансляции, в котором пользователи могут осуществлять поиск.
- Live Edge — новейшая часть прямой трансляции, доступная игроку.
- Play Head — временная метка пользовательского интерфейса для текущей позиции воспроизведения.
Трансляция в прямом эфире
Есть два способа настроить SDK Web Receiver для использования Live API для контента:
- используя перехватчик сообщений
LOAD
в вашем приложении Web Receiver. (рекомендуемые) - используя сгенерированный запрос загрузки на стороне отправителя или получателя.
Перехватчик предоставляет объект LoadRequestData
, который содержит все важные метаданные о запросе на загрузку. Чтобы указать, что запрос на загрузку предназначен для живого потока, просто установите для streamType
объекта mediaInformation
значение StreamType.LIVE
. MediaInformation.duration
должно быть равно -1
, так как экземпляры проигрывателя несут ответственность за его вычисление, когда содержимое находится в состоянии LIVE
.
/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => { /* cast.framework.messages.LoadRequestData */
request.media.streamType = cast.framework.messages.StreamType.LIVE;
return request;
});
Добавление данных программы передач
Прямые потоки, особенно длительные потоки, такие как телеканал, могут отображать на экране метаданные руководства / программирования на основе текущей позиции воспроизведения в прямом эфире. Поставщикам содержимого настоятельно рекомендуется включать программные метаданные в свои приложения веб-приемника для повышения удобства работы конечных пользователей.
Вы можете настроить начальные направляющие данные для потока в перехватчике сообщений LOAD точно так же, как мы указывали, что поток является живым потоком в предыдущем примере. Отдельные разделы или программы в прямом эфире представлены в виде объектов MediaMetadata
, которые затем сохраняются в очереди . Существует другой класс MediaMetadata
для разных типов программ, например, TvShowMediaMetadata
, MovieMediaMetadata
, MusicTrackMediaMetadata
и т. д.
В следующем фрагменте кода мы используем объект MediaMetadata
, чтобы указать время начала каждого шоу с временной меткой UNIX со свойством sectionStartAbsoluteTime
. Продолжительность программы представлена в секундах.
// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;
const previousShow = new ...;
const nextShow = new ...;
const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];
playerManager.getQueueManager().setContainerMetadata(containerMetadata);
Диапазон поиска в реальном времени
Cast SDK включает в себя элементы пользовательского интерфейса и элементы управления, которые позволяют пользователю перемещать точку воспроизведения в потоке с помощью расширенного контроллера или сенсорных элементов управления на устройствах с сенсорным экраном.
LiveSeekableRange
представляет диапазон времени в потоке, в течение которого пользователь может выполнять поиск. В веб-приемнике вы можете получить доступ к информации о доступном для поиска диапазоне с помощью PlayerManager.getLiveSeekableRange()
, который возвращает объект LiveSeekableRange
. Основные свойства объекта, о которых следует знать:
- start — время начала (в секундах) диапазона относительно начала потока в секундах.
- end — максимально возможное время (в секундах), которое игрок может искать на основе доступных сегментов относительно начала потока.
- isMovingWindow — логическое значение, указывающее, перемещается ли доступный для поиска диапазон (т. е. старые сегменты удаляются из манифеста) вместе с потоком, это должно быть верно для всех живых потоков.
- isLiveDone — логическое значение, указывающее, завершена ли прямая трансляция, что означает, что новые сегменты не создаются.
Размер доступного для поиска диапазона, представленный как время между start
и end
, определяется количеством сегментов, доступных в потоке, и будет перемещаться вместе с потоком. Например, если в начале потока диапазон поиска равен {start:0, end: 600, isMovingWindow: false, isLiveDone: false}
, через десять секунд после запуска потока он может стать {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}
. Важно отметить, что время начала и окончания в доступном для поиска диапазоне обновляется в зависимости от времени, необходимого для создания нового сегмента. Таким образом, если типичная длина сегмента для вашего потока составляет 10 секунд, время начала и окончания также будет обновляться примерно каждые 10 секунд.
Отключить поиск
Чтобы отключить поиск в потоке, вам необходимо удалить функцию поиска из поддерживаемых медиа-команд в веб-приемнике:
// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);
Удаление поддерживаемой команды мультимедиа для сигналов SEEK
для приложений-отправителей и сенсорных дисплеев для отключения поиска, но не отключает голосовые команды, такие как «Окей, Google, поиск назад на 30 секунд». Подробную информацию о том, как отключить мультимедийные команды для голоса, см. в поддерживаемых мультимедийных командах с голосовым руководством.
Живые фреймворковые события
Два события, LIVE_ENDED
и LIVE_IS_MOVING_WINDOW_CHANGED
, включены в Live API. Оба события передаются в объект LiveStatusEvent
, который содержит текущий доступный для поиска диапазон.
Событие | Описание |
---|---|
LIVE_ENDED | Срабатывает, когда прямой эфир заканчивается. В этот момент конечное значение в LiveSeekableRange перестанет обновляться; пользователи по-прежнему смогут просматривать контент в пределах диапазона поиска в реальном времени. |
LIVE_IS_MOVING_WINDOW_CHANGED | Запускается, когда доступный для поиска диапазон живого потока изменяется с фиксированного окна на движущееся окно или наоборот. Для прямой трансляции это произойдет, когда проигрыватель обнаружит, что манифест удаляет более ранние сегменты. |
Сценарии прямых трансляций
Существует восемь возможных типов сценариев прямой трансляции, каждый из которых настраивается путем установки трех основных параметров:
- Поток имеет время начала
- Поток имеет время окончания
- Пользователям разрешено искать в окне поиска в прямом эфире.
См. раздел Добавление данных программы передач , чтобы узнать, как настроить эти значения.
Ниже приведены описания и скриншоты сценариев, поддерживаемых Live API. Переменные T1 и T2 используются для представления отметки времени слева и справа от пользовательского интерфейса соответственно.
Время начала | Время окончания | Ищет | Т1 | Т2 | |
---|---|---|---|---|---|
Сценарий 1 | Нет | Нет | Нет | Играть головой | Не показаны |
Сценарий 7 | Да | Да | Нет | Показать время начала | Показать время окончания |
Сценарий 8 | Да | Да | Да | Показать время начала | Показать время окончания |
Сценарий первый
Время начала | Время окончания | Ищет | Т1 | Т2 |
---|---|---|---|---|
Нет | Нет | Нет | Играть головой | Не показаны |
В первом сценарии нет времени начала или окончания, и пользователи не могут выполнять поиск в потоке. Когда пользователь останавливает поток, воспроизведение возобновляется с живого края, а не с того места, где поток был приостановлен.
Сценарий седьмой
Время начала | Время окончания | Ищет | Т1 | Т2 |
---|---|---|---|---|
Да | Да | Нет | Играть головой | Продолжительность программы |
Сценарий семь имеет время начала и время окончания, но не доступен для поиска. Две метки времени в пользовательском интерфейсе, T1 и T2, представляют текущее время воспроизведения и общую продолжительность программы соответственно. Если пользователь приостанавливает/возобновляет воспроизведение, поток возобновится на живом краю потока. В приведенном выше примере красная часть строки поиска представляет часть потока с момента начала просмотра пользователем.
Сценарий восьмой
Время начала | Время окончания | Ищет | Т1 | Т2 |
---|---|---|---|---|
Да | Да | Да | Играть головой | Продолжительность программы |
Сценарий семь имеет время начала, время окончания и доступен для поиска. Две метки времени в пользовательском интерфейсе, T1 и T2, представляют текущее время воспроизведения и общую продолжительность программы соответственно. Если пользователь приостанавливает/возобновляет воспроизведение, поток возобновится с момента приостановки, если он находится в доступном для поиска окне — область красного цвета на панели поиска показывает, куда пользователь может вернуться, а область белого цвета представляет, где он может искать вперед.
Настройка сценария
Настройка потока как конкретного Live Scenario состоит из трех частей:
- Установить тип потока — пометить поток как прямой эфир.
- Добавить данные программы передач — установите время начала и продолжительность в объекте
MediaMetadata
. - Настроить функциональность поиска — включить или отключить поиск.
Поведение воспроизведения
Во время паузы пользовательский интерфейс будет по-прежнему обновлять свои метаданные воспроизведения, включая время начала воспроизведения и время фронта в реальном времени. При возобновлении потока необходимо учитывать несколько вариантов поведения, которые зависят от конфигурации потока.
Доступные для поиска потоки
При возобновлении доступного для поиска потока:
- Активный край должен быть обновлен до текущего местоположения, и диапазон поиска будет соответствующим образом скорректирован.
- Если указатель воспроизведения переходит за пределы текущего шоу, полоса прокрутки будет обновлена метаданными из нового шоу (включая время начала и время окончания, если они доступны).
- Если доступное для поиска окно имеет длину «X», доступный для поиска диапазон будет простираться назад не более чем до «X» или до начала шоу, в зависимости от того, что меньше.
- Если пользователь был приостановлен достаточно долго, так что текущее время больше не находится в доступном для поиска окне, поток возобновится в самой ранней точке (крайней левой) доступного для поиска окна.
Перейдите к LiveSeekableRange.end
, чтобы возобновить воспроизведение в реальном времени после снятия паузы.
let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
...
if (playerManager.getLiveSeekableRange()) {
// Resume playback at the live edge
playerManager.seek(playerManager.getLiveSeekableRange().end);
} else {
return requestData;
}
...
});
Потоки без поиска
При возобновлении недоступного для поиска потока:
- В этом случае воспроизведение возобновится на живом фронте.
- Если прямая граница выходит за пределы текущего шоу, полоса прокрутки должна быть обновлена метаданными из нового шоу (включая время начала и время окончания, если они доступны).
Изменения поверхности API и настройка Live UI
Cast SDK имеет встроенную поддержку для создания пользовательских интерфейсов вместо использования стандартного пользовательского интерфейса. Однако важно следовать контрольному списку Cast UX Design при настройке интерфейса.
Веб-приемник
В веб-приемнике PlayerData
включает следующие поля, позволяющие разработчикам расширять свои настраиваемые интерфейсы для прямых трансляций:
- isLive — флаг, указывающий, является ли текущий поток живым потоком, а не VOD.
- liveSeekableRange - диапазон поиска, отображаемый на экране, ограничивающем окно DVR.
- mediaStartAbsoluteTime — когда секция началась в абсолютном времени ( UNIX Epoch ).
- sectionStartTimeInMedia - время начала раздела в секундах относительно времени запуска мультимедиа.
- sectionDuration - продолжительность раздела в секундах.
Также не забудьте принять во внимание два живых события при настройке пользовательского интерфейса.
SDK для Android
Как часть функциональности Live, использование виджета Android Seekbar в UIMediaController
устарело, вместо этого используйте CastSeekBar
.