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

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

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

Предпосылки

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

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

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

Трансляция в прямом эфире

Есть два способа настроить SDK Web Receiver для использования Live API для контента:

  1. используя перехватчик сообщений LOAD в вашем приложении Web Receiver. (рекомендуемые)
  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
Нет Нет Нет Играть головой Не показаны

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

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

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

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

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

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

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

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

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

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

Настройка потока как конкретного Live Scenario состоит из трех частей:

  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 - продолжительность раздела в секундах.

Также не забудьте принять во внимание два живых события при настройке пользовательского интерфейса.

SDK для Android

Как часть функциональности Live, использование виджета Android Seekbar в UIMediaController устарело, вместо этого используйте CastSeekBar .