Прямая трансляция

Cast SDK включает встроенные API для поддержки живого контента. Сюда входит гибкий готовый пользовательский интерфейс в сочетании с API, которые позволяют разработчикам создавать богатые интерактивные возможности всего с помощью нескольких строк кода. Live API поддерживает отображение времени начала и окончания, метаданных программы, элементов управления DVR и окон с возможностью поиска.

В этом руководстве показано, как настроить поток для API Live, включая примеры кода и метаданных для настройки основных сценариев Live, а также снимки экрана, демонстрирующие, как выглядит каждый сценарий.

Предварительные условия

Перед прочтением этого руководства необходимо ознакомиться с основами реализации веб-приемника . Кроме того, для запуска примеров кода вам понадобится доступ к прямому потоку, который соответствует одному из поддерживаемых типов мультимедиа для Cast . В целом функция Live поддерживает типичные конфигурации прямых трансляций для поддерживаемых носителей .

В руководстве используются следующие термины:

  • Окно поиска — диапазон прямой трансляции, в котором пользователи могут искать.
  • Live Edge — новейшая часть прямой трансляции, доступная игроку.
  • Play Head — временная метка пользовательского интерфейса для текущей позиции воспроизведения.

Трансляция прямой трансляции

Существует два способа настроить SDK веб-приемника для использования Live API для контента:

  1. используя перехватчик сообщений LOAD в вашем приложении веб-приемника. (рекомендуется)
  2. с использованием запроса на загрузку, сгенерированного на стороне отправителя или получателя.

Перехватчик предоставляет объект 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 Нет Нет Нет Играть головой Не показано
Сценарий 2 Нет Нет Да Играть головой Не показано
Сценарий 3 Нет Да Нет Играть головой Не показано
Сценарий 4 Нет Да Да Играть головой Не показано
Сценарий 5 Да Нет Нет Показать время начала Играть головой
Сценарий 6 Да Нет Да Показать время начала Играть головой
Сценарий 7 Да Да Нет Показать время начала Показать время окончания
Сценарий 8 Да Да Да Показать время начала Показать время окончания

Сценарий первый

Время начала Время окончания Доступный для поиска Т1 Т2
Нет Нет Нет Играть головой Не показано

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

Сценарий седьмой

Телевизор, показывающий Live UI Chromecast для сценария 7 с указанием времени на часахМобильный телефон с пользовательским интерфейсом Live для сценария 7 с функцией Clock Time.

Время начала Время окончания Доступный для поиска Т1 Т2
Да Да Нет Играть головой Продолжительность программы

В седьмом сценарии есть время начала и время окончания, но его нельзя найти. Две временные метки в пользовательском интерфейсе, T1 и T2, представляют текущее время воспроизведения и общую продолжительность программы соответственно. Если пользователь приостанавливает/возобновляет воспроизведение, поток возобновится с начала живого потока. В приведенном выше примере красная часть панели поиска представляет часть потока с момента начала просмотра пользователем.

Сценарий восьмой

Телевизор, показывающий Live UI Chromecast для сценария 8 с указанием времени на часахМобильный телефон с интерактивным пользовательским интерфейсом Live для сценария 8 с функцией Clock Time.

Время начала Время окончания Доступный для поиска Т1 Т2
Да Да Да Играть головой Продолжительность программы

Сценарий седьмой имеет время начала и время окончания и доступен для поиска. Две временные метки в пользовательском интерфейсе, T1 и T2, представляют текущее время воспроизведения и общую продолжительность программы соответственно. Если пользователь приостанавливает/возобновляет воспроизведение, поток возобновится с того момента, когда он был приостановлен, если он находится в пределах окна поиска: область красного цвета на панели поиска показывает, куда пользователь может вернуться, а область белого цвета показывает, где он может искать. вперед.

Настройка сценария

Настройка потока как конкретного сценария Live выполняется в три этапа:

  1. Установить тип потока — пометить поток как прямой эфир.
  2. Добавить данные программы передач — установите время начала и продолжительность в объекте MediaMetadata .
  3. Настроить функциональность поиска — включить или отключить поиск.

Поведение воспроизведения

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

Доступные для поиска потоки

При возобновлении доступного для поиска потока:

  • Активный край будет обновлен до текущего местоположения, и диапазон поиска будет соответствующим образом скорректирован.
  • Если указатель воспроизведения перейдет за пределы текущего шоу, полоса прокрутки будет обновлена ​​метаданными из нового шоу (включая время начала и время окончания, если они доступны).
  • Если окно поиска имеет длину «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 .