Кастинг, второй экран и непрерывность в OTT

Автор: Николай СапуновОбновлено: август 202616 мин чтения
Содержание статьи +

TL;DR

Кастинг – функция, которая позволяет зрителю начать сериал на телефоне и «перебросить» его на телевизор, и самое важное здесь то, что настоящий кастинг – это не зеркалирование экрана: при кастинге телефон становится пультом, а телевизор сам забирает и проигрывает поток, поэтому всё продолжает работать, когда телефон заблокирован, и поэтому кастинг работает с защищённым контентом, который зеркалирование показать не может. Реализовывать его придётся через несколько отдельных экосистем – Google Cast (технология, раньше привязанная к донглу Chromecast, а теперь встроенная в большинство смарт-ТВ), Apple AirPlay, новый стандарт Matter Casting и протокол запуска DIAL, – потому что ни одна из них не дотягивается до всех устройств. Когда поток уже на телевизоре, телефон превращается во второй экран и управляет воспроизведением, паузой, перемоткой и громкостью по небольшому каналу сообщений, а та же связка переносит позицию зрителя, чтобы можно было продолжить с того места, где он остановился. Непрерывность – ряд «Продолжить просмотр», который возобновляет с точностью до секунды на телефоне, телевизоре и в браузере, – это отдельная серверная система, хранящая позицию каждого зрителя, и именно она тихо удерживает аудиторию во всём продукте.

Почему это важно

Большинство премиального просмотра происходит на телевизоре, но почти всё знакомство и регистрация – на телефоне, поэтому мост между двумя экранами решает, ощущается продукт удобным или сломанным. Основатель, который считает «кастинг на ТВ» галочкой, обычно открывает для себя три дорогих сюрприза: что кастинг и зеркалирование – это разные функции с разным кодом, что защищённому контенту нужна собственная лицензия на принимающем устройстве и что «продолжить с того же места на любом устройстве» – это бэкенд-сервис, который никто не заложил. Эта статья объясняет все три простым языком, чтобы вы заложили их в бюджет правильно, говорили с инженерами о нужных протоколах и избежали переписывания, которое случается, когда кастинг путают с зеркалированием. Она опирается на клиентскую матрицу OTT и единую стратегию плеера, а также на пакет «закодируй один раз» из статьи упаковка: CMAF, HLS и DASH.

Кастинг – это не зеркалирование

Начнём с заблуждения, которое порождает больше всего лишней работы, потому что от него зависит всё остальное. Есть два совершенно разных способа доставить видео с телефона на телевизор, и кода общего у них почти нет.

Первый способ – зеркалирование экрана: телефон сам рисует картинку, захватывает экран как поток пикселей и в реальном времени отправляет эти пиксели на телевизор. Телевизор – тупой монитор; всю работу делает телефон. Зеркалирование универсально – оно может показать что угодно с телефона, – но для видео это неправильный инструмент. Оно сажает батарею телефона, потому что телефон непрерывно декодирует и заново кодирует; качество ограничено живым захватом, а не исходным файлом; любой звонок или уведомление прерывает его; и – решающая проблема – защищённый контент обычно вообще отказывается зеркалироваться, показывая чёрный прямоугольник на месте видео, потому что правила защиты считают захват экрана копированием. (Саму модель защиты мы разбираем в статье зачем нужен DRM и что он защищает.)

Второй способ – кастинг, иногда называемый «перебросом» (fling), и именно его хотят OTT-продукты. Когда зритель нажимает кнопку кастинга, телефон не отправляет пиксели. Он отправляет короткое сообщение – веб-адрес потока, веб-адрес лицензии и позицию, с которой начать, – и уходит со сцены. Телевизор сам забирает поток из сети доставки контента (CDN) и проигрывает его своим плеером, ровно как это сделало бы нативное ТВ-приложение. Телефон теперь только пульт. Представьте заказ в ресторане: зеркалирование – это когда вы сами носите каждую тарелку из кухни к столу; кастинг – это когда вы отдаёте кухне заказ и садитесь, а еду приносит персонал.

Этот единственный архитектурный выбор – приёмник сам забирает и проигрывает поток – объясняет каждое преимущество кастинга. Телефон может заблокироваться, погаснуть, принять звонок или уйти из комнаты, а просмотр продолжится, потому что телефона никогда не было в видеотракте. Картинка идёт в полном качестве, потому что телевизор тянет те же файлы с высоким битрейтом, что и ТВ-приложение. И защищённое видео работает, потому что приёмник может получить собственную лицензию – а это та часть, о которой команды забывают.

Рисунок 1. Кастинг против зеркалирования. При кастинге приёмник тянет поток, телефон – лишь пульт; при зеркалировании телефон в видеотракте, а защищённый контент блокируется.

Приёмнику нужен собственный ключ

Вот следствие, которое удивляет почти каждую первую сборку. Поскольку устройство-приёмник само забирает и расшифровывает поток, оно должно получить собственную лицензию защиты контента – лицензия телефона с ним не путешествует. Защищённые файлы шифруются один раз, по схеме cbcs стандарта Common Encryption (ISO/IEC 23001-7), и любое совместимое устройство может их проиграть, если сумеет получить ключ. Модель «зашифруй один раз, лицензируй многократно» мы разбираем в статье multi-DRM: один процесс, все устройства.

Поэтому, когда зритель кастит защищённый фильм, принимающее устройство делает собственный поход к вашему лицензионному серверу. На приёмнике Google Cast – который, как мы увидим, является небольшим веб-приложением – запрос лицензии идёт через браузерный интерфейс Encrypted Media Extensions (стандарт W3C EME) к Widevine или PlayReady. По Apple AirPlay приёмник несёт обмен лицензией FairPlay; документация Apple прямо говорит, что FairPlay Streaming работает везде, куда вы транслируете по AirPlay, включая Apple TV и смарт-ТВ со встроенным AirPlay. В любом случае практическое правило для вашей платформы одно: ваши системы прав доступа и лицензий должны принимать запрос от кастящего устройства, а не только от исходного телефона. Классический сбой – проверка прав, привязанная к сессии телефона или его сетевому адресу; как только воспроизведение прыгает на телевизор, эта проверка падает, и кастинг показывает ошибку. Проектируйте путь лицензии для приёмника с первого дня – как этот путь строится, см. в статье лицензионные серверы и доставка ключей.

Экосистемы кастинга: их у вас будет несколько

Универсальной кнопки кастинга нет, потому что кастинг вырос внутри конкурирующих экосистем. Чтобы дойти до массовой аудитории, вы реализуете две-три из них, и стоит понимать, для чего каждая.

Google Cast – самая распространённая. Она началась с донгла Chromecast, и хотя Google прекратил это железо в августе 2024 года (заменив его на Google TV Streamer за $100), сама технология Cast никуда не делась – теперь она встроена в устройства Google TV, в телевизоры LG webOS и, по итогам развёртывания 2026 года, в телевизоры Samsung – и новые, и старые. Так что «поддержка Chromecast» в 2026 году в основном означает «телевизор уже умеет Cast», а не «у пользователя есть донгл». Технически приёмник Cast – это Web Receiver: приложение на HTML5 и JavaScript, которое работает на телевизоре, показывает ваш брендинг и проигрывает медиа встроенным плеером (собственным от Google или Shaka Player). Ваш телефон или веб-приложение – это отправитель; он запускает приёмник по идентификатору приложения, а затем обменивается с ним короткими сообщениями – load, play, pause, seek. Чтобы проигрывать защищённый контент, вы собираете Custom Web Receiver, потому что именно этот тип приёмника поддерживает DRM.

Apple AirPlay покрывает экосистему Apple и множество смарт-ТВ, в которых теперь есть AirPlay 2. Его большой плюс для разработчика в том, что если вы проигрываете видео через стандартный плеер Apple, AVPlayer, AirPlay достаётся вам почти бесплатно: AVPlayer показывает выбор устройства и автоматически передаёт видео и звук выбранному приёмнику AirPlay, который затем сам забирает поток HLS. Тонкость, которую важно учесть: у AirPlay есть и видеорежим (приёмник тянет поток – то, что вам нужно), и режим зеркалирования; для защищённого контента нужно включить внешнее воспроизведение видео, чтобы FairPlay шёл по AirPlay, а не падал в заблокированное зеркало.

Matter Casting – новейший участник, опубликованный Connectivity Standards Alliance (объединением, стоящим за умным домом Matter). Его реализуют устройства Amazon Fire TV и Echo Show (спецификация Matter 1.3, движется к 1.4), а приложения вроде Prime Video и Tubi его внедрили. Его модель чётко называет части: ваше телефонное приложение – клиент, телевизор – плеер, а ваше ТВ-приложение – контент-приложение; телефон находит плееры в сети, подключается к ним через однократное защищённое сопряжение, а затем шлёт стандартные команды управления (play, pause, навигация, громкость).

DIAL – сокращение от DIscovery And Launch – стоит особняком и заслуживает понимания. Совместно разработанный Netflix и YouTube, он ничего не транслирует; он лишь позволяет вашему телефону найти и запустить ваше собственное нативное приложение на телевизоре. «Воспроизвести на ТВ» у YouTube, которое будит настоящее ТВ-приложение YouTube, а не толкает поток, – канонический пример. DIAL отвечает на вопрос «есть ли тут моё ТВ-приложение и можешь ли ты его открыть?»; дальше стримингом занимается само нативное приложение.

Под всем этим у открытого веба есть свой ответ – W3C Remote Playback API, который позволяет веб-странице перебросить видеоэлемент на удалённое устройство, вместе с W3C Presentation API и протоколом Open Screen Protocol, нацеленным на унификацию кастинга между вендорами. Эти стандарты – причина, по которой кнопка кастинга появляется внутри браузера, и они же – путь долгосрочной сходимости, но в 2026 году вы по-прежнему выпускаете нативные экосистемы, чтобы дотянуться до парка устройств.

ЭкосистемаОтправителиПриёмникиDRM на приёмникеРоль телефонаОткрытый стандарт?
Google CastAndroid, iOS, ChromeGoogle TV, многие смарт-ТВWidevine/PlayReady (EME)Пульт (после load)Нет – у Google
Apple AirPlay 2iPhone, iPad, MacApple TV, ТВ с AirPlay 2FairPlay по AirPlayПульт (через AVPlayer)Нет – у Apple
Matter CastingiOS, AndroidFire TV, Echo ShowЗадаёт контент-приложениеПульт (кластеры)Да – CSA / Matter
DIALiOS, AndroidТВ и приставки с DIALНет – запускает приложениеЗапускает, играет приложениеДа – открытая спека
W3C Remote PlaybackБраузерыУстройства Open ScreenЧерез EME на страницеПульт (медиаэлемент)Да – W3C
Рисунок 2. Экосистемы кастинга. Ни одна не дотягивается до всех устройств, поэтому реальный продукт реализует две-три; DIAL запускает нативное приложение, а не транслирует.

Передача воспроизведения, шаг за шагом

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

Сначала обнаружение: отправитель находит приёмники в той же домашней сети через локальный поиск (multicast DNS для Cast и Matter, SSDP для DIAL). Зритель видит список телевизоров и выбирает один. Второе – сессия и загрузка (load): отправитель открывает сессию и шлёт короткое сообщение load – URL потока, URL лицензии и стартовую позицию. (Для защищённого контента приёмник дальше использует этот URL лицензии.) Третье – забор и лицензия: приёмник запрашивает манифест из CDN, а для защищённого видео – ключ у вашего лицензионного сервера; собственную лицензию, как мы подчёркивали выше. Четвёртое – воспроизведение: приёмник декодирует и играет в полном качестве. Пятое – управление: отправитель перерисовывается в пульт – ползунок, play/pause, громкость, выбор дорожек и субтитров, – и каждое касание это сообщение приёмнику. Шестое, о чём легко забыть, – отчёт о позиции: приёмник (или отправитель от его имени) продолжает слать текущую позицию на ваши серверы, чтобы непрерывность работала, даже когда телефон уже не проигрывает.

Рисунок 3. Передача каста. Телефон шлёт URL и стартовую позицию; приёмник забирает поток и собственную лицензию; телефон становится пультом; маяки позиции питают непрерывность.

Минимальное сообщение load – «дескриптор воспроизведения», который отправитель передаёт приёмнику, – выглядит так, и поле startPosition – это то, что заставляет каст возобновиться, а не начаться заново:

{
  "contentUrl": "https://cdn.example.com/title/abc/master.m3u8",
  "drm": {
    "licenseUrl": "https://lic.example.com/widevine",
    "scheme": "cbcs"
  },
  "startPositionSec": 1325,
  "subtitleTrack": "ru",
  "analyticsBeacon": "https://qoe.example.com/collect"
}

Второй экран: телефон как более богатый пульт

Когда поток уже на телевизоре, телефон становится вторым экраном – и хороший делает больше, чем play и pause. Поскольку отправитель и приёмник делят небольшой двусторонний канал сообщений, телефон может показывать ползунок с превью, переключать аудио и субтитры, управлять очередью следующего, регулировать громкость и показывать справку «кто это?» по актёрам, не закрывая картинку на телевизоре. В модели Matter это буквально именованные группы управления – кластер media playback для play и pause, кластер keypad input для навигации, кластер application launcher для открытия приложения, – а в Google Cast это сообщения, которые обрабатывает менеджер сессий приёмника.

Кирпичик открытого веба, который стоит знать здесь, – это W3C Media Session API: он позволяет плееру публиковать, что играет (название, обложка) и какие элементы управления он поддерживает (play, pause, seek-to, next, previous), чтобы операционная система, экран блокировки, дисплей в машине и внешние контроллеры показывали согласованные рабочие кнопки. Те же метаданные, что зажигают экран блокировки, зажигают и пульт кастинга. Сделанный хорошо, второй экран – это место, где зритель листает следующую серию, пока идёт текущая, – настоящая продуктовая поверхность, а не довесок. Измерять, насколько хорошо она ведёт себя, – задача статьи инструментирование QoE плеера.

Непрерывность: тихий двигатель удержания

Непрерывность – функция с самым низким профилем и самой высокой отдачей. Это ряд «Продолжить просмотр», который позволяет зрителю остановить фильм в электричке и продолжить на телевизоре в гостиной ровно с той секунды, на которой он остановился, на любом устройстве, в том числе после каста. Ощущается как магия; на деле это небольшой загруженный бэкенд-сервис, и он отделён от кастинга, хотя кастинг от него зависит.

Механизм – точка возобновления: сохранённая запись о том, как далеко каждый зритель посмотрел каждый тайтл, с ключом по профилю зрителя и контенту. Пока что-либо играет – на телефоне, в вебе, на телевизоре или на кастящем приёмнике – плеер шлёт короткое сообщение «я на секунде N» контрольным сигналом (heartbeat), обычно каждые 10–30 секунд плюс на паузе, перемотке и остановке. Сервис прогресса записывает последнюю позицию; ряд «Продолжить просмотр» читает её обратно и сортирует тайтлы по недавности просмотра. Честным его держат два правила. Первое – побеждает последнее обновление, когда два устройства сообщают разные позиции, так что самое свежее действие и есть истина. Второе – порог завершения решает, когда что-то считается досмотренным и выпадает из ряда – обычно когда зритель проходит около 90–95% хронометража, чтобы финальные титры не оставляли «досмотренный» тайтл навсегда висеть в «Продолжить просмотр».

Здесь же не стоит путать две разные идеи, которые обе называют «непрерывностью». Кросс-девайсное возобновление, описанное здесь, – это ваша серверная функция, и она работает на любой платформе. «Continuity»/Handoff у Apple – отдельное удобство операционной системы между собственными устройствами пользователя Apple; поддержать его приятно, но это не то, как «Продолжить просмотр» работает в масштабе. Отдача в удержании прямая – лёгкое возобновление один из сильнейших рычагов на то, вернётся ли зритель, что напрямую связано с аналитикой оттока и удержания.

Рисунок 4. Непрерывность. Каждый плеер сообщает позицию контрольным сигналом в одно хранилище прогресса; ряд «Продолжить просмотр» читает её обратно, побеждает последняя запись, порог завершения убирает досмотренное.

Размер хранилища прогресса – покажем математику

Непрерывность выглядит пустяком, пока её не умножишь на аудиторию, так что посчитайте арифметику до выбора базы данных. Допустим, у вас 1 000 000 одновременных зрителей, и каждое играющее устройство сообщает позицию каждые 30 секунд. Устойчивая частота записей – это число зрителей, делённое на интервал:

записей в секунду = 1 000 000 зрителей ÷ 30 секунд
                  ≈ 33 333 записи в секунду

Это базовый уровень. Паузы, перемотки и события старт/стоп добавляют всплески сверху, а премьера или финал могут удвоить одновременность за минуты. Тридцать три тысячи маленьких записей в секунду, каждую секунду, – это реальная инженерная цель: она требует быстрого key-value хранилища с ключом «профиль-и-тайтл», тракта записи, который поглощает всплески, и осознанного выбора интервала heartbeat – потому что сокращение интервала вдвое до 15 секунд удваивает нагрузку до ~66 667 записей в секунду при той же аудитории. В этом и состоит вывод всей статьи в духе «масштаб прежде всего»: эффектная часть – анимация каста, но часть, которая решает ваш счёт и вашу надёжность, – неэффектное хранилище прогресса за рядом «Продолжить просмотр».

«Частые ошибки – пять, которые ломают опыт двух экранов. Первая: собрать зеркалирование, когда имелся в виду кастинг – зеркалирование сажает батарею, режет качество и блокируется для защищённого видео; реализуйте настоящий кастинг, где приёмник забирает поток. Вторая: забыть, что приёмнику нужна собственная лицензия – проверка прав, привязанная к сессии телефона, ломается, как только воспроизведение прыгает на телевизор. Третья: выпустить только одну экосистему – Google Cast, AirPlay и Matter Casting дотягиваются до разных устройств, а DIAL лишь запускает нативное приложение, а не транслирует. Четвёртая: не передавать позицию возобновления при касте, так что телевизор начинает фильм с нуля. Пятая: считать «Продолжить просмотр» функцией интерфейса, а не нагруженным записями бэкенд-сервисом, и потом смотреть, как он падает на пике премьеры.»

Где здесь Фора Софт

Кастинг и непрерывность – это, по сути, задача масштаба, переодетая в удобство: кнопка каста проста, но заставить приёмник получить собственную лицензию, выдержать 33 000 записей в секунду в точке возобновления и заставить три экосистемы вести себя одинаково – это и есть работа. Фора Софт строит видеостриминг, OTT/Internet TV, видеоконференции, e-learning и телемедицину с 2005 года – 250+ проектов для 400+ клиентов за 20+ лет, – поэтому подключить Google Cast, AirPlay и Matter Casting к защищённому каталогу и поднять сервис точки возобновления, который держит одновременность, – это повседневная суть нашей стриминговой работы в вебе, на мобильных и в гостиной. Мы вендоронейтральны: мы подбираем экосистемы кастинга под вашу реальную аудиторию устройств и правила правообладателей, а не продаём единый SDK.

Ключевые выводы

  • При кастинге поток забирает телевизор; телефон – лишь пульт, поэтому кастинг бьёт зеркалирование.
  • Зеркалирование блокируется для защищённого видео и сажает батарею; не выпускайте его как «кастинг».
  • Приёмник каста получает собственную лицензию DRM – права должны принимать ТВ, а не только телефон.
  • Универсальной кнопки нет: реализуйте Google Cast, AirPlay и часто Matter Casting; DIAL лишь запускает приложение.
  • Непрерывность – серверный сервис точки возобновления: heartbeat позиции, побеждает последняя запись, порог завершения.
  • При 1 млн зрителей и heartbeat 30 с хранилище берёт ~33 000 записей/секунду – закладывайте это.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.