Cast SDK включает встроенные API для поддержки живого контента. Сюда входит гибкий готовый пользовательский интерфейс в сочетании с API, которые позволяют разработчикам создавать богатые интерактивные возможности всего с помощью нескольких строк кода. Live API поддерживает отображение времени начала и окончания, метаданных программы, элементов управления DVR и окон с возможностью поиска.
В этом руководстве показано, как настроить поток для API Live, включая примеры кода и метаданных для настройки основных сценариев Live, а также снимки экрана, демонстрирующие, как выглядит каждый сценарий.
Предварительные условия
Перед прочтением этого руководства необходимо ознакомиться с основами реализации веб-приемника . Кроме того, для запуска примеров кода вам понадобится доступ к прямому потоку, который соответствует одному из поддерживаемых типов мультимедиа для Cast . В целом функция Live поддерживает типичные конфигурации прямых трансляций для поддерживаемых носителей .
В руководстве используются следующие термины:
- Окно поиска — диапазон прямой трансляции, в котором пользователи могут искать.
- Live Edge — новейшая часть прямой трансляции, доступная игроку.
- Play Head — временная метка пользовательского интерфейса для текущей позиции воспроизведения.
Трансляция прямой трансляции
Существует два способа настроить SDK веб-приемника для использования Live API для контента:
- используя перехватчик сообщений
LOAD
в вашем приложении веб-приемника. (рекомендуется) - с использованием запроса на загрузку, сгенерированного на стороне отправителя или получателя.
Перехватчик предоставляет объект 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 выполняется в три этапа:
- Установить тип потока . Отметьте поток как прямой эфир.
- Добавить данные программы передач — установите время начала и продолжительность в объекте
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 - продолжительность раздела в секундах.
Также обязательно учтите два живых события при настройке пользовательского интерфейса.
Android SDK
В рамках функциональности Live использование Android Seekbar Widget в UIMediaController
устарело, вместо этого используйте CastSeekBar
.