Разработка кроссплатформенных приложений для аудио- и видеостриминга в 2026 году — обложка

Главное

Фрагментация матрицы кодеков — это скрытая статья расходов. iOS предпочитает H.265, на Android повсеместно используется H.264, для веба нужно определять поддержку AV1, а десктопные приложения на Windows игнорируют H.265. Один-единственный битрейт не подойдёт 40–60% ваших зрителей.

Плееры привязаны к платформе. AVPlayer (iOS), ExoPlayer (Android), hls.js/Shaka (веб), нативные tvOS/ Tizen — всё это нельзя использовать взаимозаменяемо. Ошибка в одном плеере влияет на миллионы зрителей на этой платформе, но остаётся незамеченной на других.

DRM работает по-разному на разных платформах. FairPlay (Apple) требует сертификатов L1; у Widevine (Google/Android) на бюджетных устройствах остаётся только L3; PlayReady охватывает 2% зрителей. Если спроектировать упрощённую DRM только для части платформ, проверка лицензирования её не пропустит.

Фоновое аудио, PiP и AirPlay/Cast — это разрешения платформы, а не функции SDK. Чтобы использовать их, нужно настроить манифесты, entitlements и согласовать возможности с операционной системой для каждой платформы отдельно, а не полагаться на кроссплатформенную обёртку.

Flutter и React Native ускоряют разработку приложения, но уступают в интеграции с платформой на уровне плеера. Для воспроизведения HLS/DASH обоим фреймворкам требуются нативные модули; ответственность за ошибки в связующем слое лежит на вас, а не на команде фреймворка.

Почему этот гайд написала Фора Софт

Кроссплатформенный видеостриминг — это задача «сделай один раз», которая на деле превращается в «выпусти отдельно под каждую платформу». Фора Софт выпустила BrainCert на вебе, iOS, Android и tvOS — более 100 тысяч клиентов, свыше 500 млн минут просмотра и 21 год практики в доставке мультимедиа. Каждый баг кодека, каждая особенность DRM и каждое подвисание кадра в плеере — всё это когда-то стоило нам сдвига сроков релиза или тихого оттока пользователей, который приходилось выявлять и исправлять.

Ловушка в том, чтобы думать, будто «кроссплатформенный SDK» автоматически решает задачу кроссплатформенного стриминга. Это не так. iOS не декодирует H.265 аппаратно на устройствах старше iPhone 8; Android-устройства ниже версии Pie не поддерживают Widevine L1; hls.js в браузере не работает с DRM-контентом без дополнительной настройки; у смарт-ТВ нет единого стандарта для субтитров IMSC. Чтобы воспроизведение работало везде одинаково, нужно понимать, на какой платформе вы находитесь, и для каждой функции реализовывать свою логику.

Этот гайд охватывает пять слоёв кроссплатформенного стриминга: поддержку кодеков на разных устройствах, особенности плееров, DRM по платформам, системные интеграции (фоновое воспроизведение, PiP, AirPlay) и выбор между нативной разработкой, Flutter, React Native и KMP. Мы ориентируемся на платформы, на которых вы реально выпускаете продукт: iOS 13+, Android 8+, веб (Chrome/Safari), tvOS и Tizen.

Создаёте стриминговое приложение для iOS, Android и веба?

За 30 минут разберём матрицу кодеков, выбор плеера и стратегию DRM — и подготовим чек-лист для каждой платформы.

Позвоните нам → Напишите нам →

Кроссплатформенная реальность — что на самом деле поддерживает каждая платформа

Нет двух платформ, которые одинаково декодируют видео. Вот как выглядит базовый уровень 2026 года для iOS, Android, веба и ТВ:

Платформа Кодеки (нативно) DRM HLS / DASH Особенности
iOS 13–16 H.264; HEVC на iPhone 6s+ Только FairPlay HLS (нативно); DASH через кастомный парсер AVPlayer зависает при ошибках сегментов; не поддерживает AV1
iOS 17+ H.264, HEVC, AV1 (только программно) Только FairPlay HLS (нативно); DASH через кастомный парсер AV1 сильно нагружает процессор и быстро разряжаает батарею; для работы требуется сертификат FairPlay
Android 8–12 H.264 (всегда); H.265 (зависит от устройства) Widevine L3; L1 на флагманах DASH (ExoPlayer); HLS (кастомный или ExoPlayer) L3 накладывает водяной знак на воспроизведение; на L3 нет возможности отката DRM к незашифрованному потоку
Android 13+ H.264, H.265, VP9, AV1 (зависит от устройства) Widevine L3 / L1 (в зависимости от устройства) DASH (ExoPlayer); HLS (собственная реализация) AV1 только на Pixel 6+; проблемы с API camera2 у некоторых ODM
Веб (Chrome) H.264, VP9, AV1 Widevine (через hls.js + EME-прослойку) DASH (нативный <video>); HLS через hls.js / ExoPlayer.js Нет DRM на http://; нужен CORS; лимиты сессий Widevine
Safari H.264, HEVC Только FairPlay HLS (нативно); DASH — нет Нет Shaka Player; MediaSource API не полностью соответствует спецификации
tvOS H.264, HEVC Только FairPlay HLS (тот же AVPlayer, что и на iOS) Текстовые дорожки (CEA-608) доступны только в формате sidecar; инлайн не поддерживается
Tizen / Roku H.264; иногда H.265 PlayReady (Tizen); PlayReady (Roku) Предпочтительно DASH; HLS — в качестве резервного варианта Поддержка субтитров зависит от SDK; единого WebVTT нет

Что объединяет всё это в 2026 году: сегменты CMAF (Common Media Application Format) с шифрованием CBCS позволяют отдавать HLS, DASH и DASH-версию CMAF из одного набора рендиций. FairPlay и Widevine поддерживают CMAF-CBCS, а PlayReady (для телевидения) — нативно. Одна перекодировка, четыре протокола, три системы DRM.

Плееры — какой использовать на каждой платформе

Универсального SDK видеоплеера не существует. У каждой платформы есть свой нативный движок или популярная open-source-альтернатива, и у них по-разному реализованы ABR, настройка буфера и обработка ошибок.

AVPlayer (iOS / tvOS)

Что это. Нативный HLS-движок Apple. Доступен автоматически на iOS 8 и выше. Отличное аппаратное декодирование H.264/265; DRM FairPlay встроен; задержка запуска — 2–3 секунды при хорошем интернете.

Слабые места. Зависает на повреждённых сегментах (восстановление не работает); не передаёт состояние ABR (приходится угадывать рендю по логам битрейта); нет поддержки DASH без кастомного парсинга; разброс длительности сегментов нарушает синхронизацию.

ExoPlayer (Android)

Что это. Открытый плеер от Google для воспроизведения DASH, HLS и SmoothStreaming. Поддерживает DASH «из коробки»; встроенная поддержка DRM Widevine L1 и L3; старт за 1,5 секунды на 4G; экономичный по CPU алгоритм ABR.

Что важно знать. Widevine L3 на бюджетных устройствах означает, что без отдельного DRM-лицензирования офлайн-загрузки невозможны; разброс длительности сегментов может вызывать сбой синхронизации; на слабом железе отчёты о пропущенных кадрах часто «шумят»; для 3G требуется тщательная настройка буфера.

hls.js (веб)

Что это. Чистый JavaScript-парсер HLS и плеер на базе MSE. Без внешних зависимостей; работает в любом браузере с поддержкой Media Source Extensions; ABR подключается модульно.

Подводные камни. Нет встроенной поддержки DRM; для Widevine требуется обёртка вроде dash.js или собственная EME-обёртка. Поддержка Safari слабая — там лучше использовать нативный HLS. Высокое потребление памяти при воспроизведении 4-часовых потоков.

Shaka Player (веб / нативный DASH)

Что это. Открытый плеер Google для воспроизведения DASH в браузере. Поддерживает встроенный DRM Widevine, позволяет смотреть видео в офлайне через IndexedDB, стартует за 1,5–2 секунды при быстром интернете.

Компромисс. Поддержка HLS — второстепенная (требуется отдельный плагин); Safari не поддерживается (используйте нативный плеер); для DRM по HTTP нужна кастомная HTTPS-прослойка.

Сначала используйте нативный плеер: AVPlayer для iOS/tvOS, ExoPlayer для Android, нативный <video> + hls.js для Chrome, нативный <video> для Safari. Переходите на Shaka или video.js только если вам нужен DASH в Chrome или офлайн-воспроизведение — дополнительная сложность потребует 4–6 недель тестирования на каждой платформе.

Поддержка кодеков по устройствам и годам — строим лестницу рендиций

Правило 1: всегда отдавайте H.264. Он есть в каждом устройстве, выпущенном после 2010 года, и к 2026 году у него не останется патентных ограничений. Это надёжный вариант на случай, если что-то пойдёт не так.

Правило 2: H.265 зависит от устройства. iPhone 6s+ (2015) и современные Android (Snapdragon 835+, 2017) поддерживают аппаратное декодирование H.265. Среднебюджетные Android-устройства — нет, например, Snapdragon 665. Браузеры не поддерживают H.265 из-за патентных ограничений. Не полагайтесь на то, что H.265 сэкономит трафик у всех зрителей.

Правило 3: AV1 — это 2026 год, но с оговорками. iOS 17 и выше декодирует AV1 программно (это расходует батарею); Android 13 и выше (Pixel 6+, Samsung S24) — аппаратно. В браузерах Chrome и Firefox аппаратный AV1 работает на новых видеокартах. AV1 экономит 20–30% трафика по сравнению с H.264 при одинаковом качестве, но на старых устройствах высокая нагрузка на процессор сводит эту экономию на нет.

Рекомендуемая лестница на 2026 год. 240p, 360p, 480p, 720p, 1080p в H.264 (обязательно). Добавьте 720p, 1080p, 2160p в H.265 для iOS 10+ и Android 8+ (по желанию, если нужна экономия). Добавьте 480p, 720p в AV1 для Chrome 90+ и iOS 17+ (по желанию, проверьте, как это скажется на батарее).

Детектирование кодеков во время воспроизведения: никогда не определяйте поддержку кодека только по названию устройства или версии ОС. Проверяйте плеер во время работы: canPlayType(’video/mp4; codecs="hev1.1.6.L123.B0"’) в вебе, canDecode(hevc) на Android, следите за ошибками AVPlayerItem.outputFileURL на iOS.

DRM по платформам — FairPlay, Widevine, PlayReady и пробелы между ними

FairPlay (iOS / tvOS / Safari). Проприетарная система защиты контента от Apple. Для работы нужен сертификат FairPlay, который выдаёт Apple (бесплатно, но оформляется вручную). Стандарт для лицензионного сервера отсутствует — аутентификацию токенов нужно реализовывать самостоятельно. На одно устройство разрешено не более 6 одновременных сессий воспроизведения. Офлайн-просмотр невозможен без дополнительной настройки.

Widevine (Android / Chrome / Firefox). DRM от Google. Три уровня защиты: L3 (программное дешифрование, все Android-устройства), L2 (частично аппаратный, встречается редко), L1 (полностью аппаратный, флагманы). На уровне L3 в старых устройствах потоки не содержат watermark, их можно записать. Лицензионный сервер должен быть сертифицирован для работы с Widevine (Axinom, EZDRM, BuyDRM, Azure Media Services). Офлайн-просмотр доступен только на уровне L1.

PlayReady (Tizen / Roku / Xbox). DRM от Microsoft, в первую очередь для телевизоров. Охватывает около 5% зрителей в мире, но необходим для лицензированного контента на ТВ. Настройка лицензионного сервера сложна; большинство платформ предлагают референсный сервер (Tizen.PlayReady, приватный API Roku). Браузерная версия PlayReady существует, но используется редко.

CMAF-CBCS как объединяющий слой. Шифрование на уровне сегментов по CBCS (Cipher Block Chaining с зашифрованными границами сэмплов) позволяет зашифровать контент один раз и использовать его для FairPlay, Widevine и PlayReady — все из одних и тех же сегментов. Это исключает необходимость двойной перекодировки и вдвое снижает объём хранения по сравнению с устаревшим подходом (отдельный AES-128 CBC для HLS и отдельный DASH cenc для DASH).

Если вам нужен лицензионный контент: закладывайте мульти-DRM с самого начала. Добавить поддержку Widevine в iOS-приложение, изначально рассчитанное только на FairPlay, займёт 4–6 недель. Используйте подписанные URL с коротким TTL (5–15 минут) на уровне манифеста, а не сегмента — подпись на уровне сегментов ломает кэширование в CDN.

WebRTC на разных платформах — пробелы в libwebrtc и особенности платформ

libwebrtc — это единая кодовая база, но не единое поведение. Google публикует исходники WebRTC; каждая платформа оборачивает и дорабатывает их. iOS использует пайплайн кодеков AVFoundation; Android — MediaCodec; Chrome — кодек-стек уровня ОС; у Safari нет libwebrtc (используется нативный WebRTC API). Это значит, что баг в кодеке на Android может не проявляться на iOS.

WebRTC в Safari (состояние на 2026 год). На iOS отсутствует шеринг экрана (ограничение Safari); нет поддержки Insertable Streams — для E2EE требуется кастомный SFU; синтаксис SDP unified-plan поддерживается не полностью до Safari 16+; видеоограничения частично игнорируются — разрешение камеры выбирает операционная система.

Конфликты Android camera2 API. Некоторые производители устройств (ODM) одновременно поддерживают два API — устаревший Camera и современный Camera2. Библиотека libwebrtc по умолчанию использует Camera2, но на устройствах с багами в camera2 (например, у некоторых моделей Xiaomi) приходится переключаться на старый Camera. Автоматического определения таких проблем нет — требуется либо белый список устройств, либо логика отката в рантайме.

Ограничения фонового режима в iOS. Аудио WebRTC остановится, если приложение перейдёт в фон без разрешения на фоновое аудио. Это разрешение требует проверки Apple и обоснования: «фоновые видеозвонки» обычно одобряют, а «фоновый музыкальный стриминг» нередко отклоняют.

Для гибрида «интерактив (WebRTC) + вещание (HLS)»: преобразуйте входящий поток WebRTC в несколько битрейтов, а затем подключите его к CMAF/HLS через сервер приёма RTMP или WHIP. Не пытайтесь перекодировать двунаправленный WebRTC на клиенте — это добавляет задержку 200–500 мс и быстро разряжает батарею.

ABR и буферизация — настройка под каждый плеер и платформу

ABR в AVPlayer непрозрачен. Он переключает качества по внутренним эвристикам, которые вы не можете полностью контролировать. Можно попробовать переопределить через preferredPeakBitRate, но плеер может проигнорировать ваше значение, если посчитает, что буферизация вот-вот начнётся. Следите за currentItem.accessLog.events через KVO и логируйте, как плеер меняет качества — вас это удивит.

ABR в ExoPlayer настраивается. DefaultLoadControl позволяет задать минимальный и максимальный порог буфера, минимальный битрейт для буферизации, параметры оценки полосы пропускания. Для 3G установите целевой буфер на 8–15 секунд (вместо стандартных 30+); для оптоволокна — 45–60 секунд. Тестируйте на реальных устройствах: в эмуляторе полоса пропускания не соответствует реальности.

ABR в hls.js определяет джиттер сети. Он анализирует потери пакетов и RTT, чтобы установить нижнюю границу качества потока. При нестабильном Wi-Fi (потери > 2%) плеер фиксируется на 480p, пока соединение не стабилизируется. Это улучшает пользовательский опыт, но может создать ощущение, что видео «застряло». Добавьте в настройки возможность вручную задать битрейт.

Правила буферизации по платформам. При переходе iOS в фон буфер сбрасывается (планируйте задержку повторного запуска менее 3 секунд). Android может сохранять буфер при приостановке приложения, но лицензии Widevine L3 истекают, если устройство находится в спящем режиме более 3 минут. Будьте готовы к перестроению буфера при возобновлении работы.

Нативная разработка vs Flutter vs React Native vs KMP — когда что подходит для стриминга

Нативная разработка (Swift / Kotlin). Плюсы: полный доступ к AVPlayer, ExoPlayer, настройке ABR на платформе, DRM API, фоновому аудио, PiP, AirPlay/Cast. Минусы: выпускать приходится дважды; время сборки примерно на 30% больше. Стриминговые приложения с высоким оттоком — лайв-шопинг, спорт, репетиторство — выпускают нативно, потому что баги QoE напрямую влияют на выручку в реальном времени.

Flutter. Плюсы: единая кодовая база; hot reload. Минусы: воспроизведение HLS/DASH требует platform channel к ExoPlayer/AVPlayer (связующий слой нужно писать самому). Аудиофокус, работа в фоне, инициализация DRM — всё это требует кастомных мостов на Kotlin или Swift. На масштабе BrainCert мы выяснили, что баги в видеомосте Flutter занимают 2–3 недели тестирования на каждый релиз — лучше выпускать нативно.

React Native. Плюсы: можно использовать логику на JavaScript из веб-версии. Минусы: видеобиблиотеки для React Native (react-native-video, react-новый exoplayer) отстают от нативных платформ по функционалу на 6–12 месяцев. Поддержка DRM, субтитров и трансляции на другие устройства — всё это требует дополнительных решений. Если выбираете React Native, закладывайте 4–6 месяцев только на настройку видеоинфраструктуры.

Kotlin Multiplatform (KMP). Развивающийся вариант: общая бизнес-логика, нативный UI. Для стриминга это означает общий парсинг манифестов, управление состоянием ABR и логику DRM-токенов, при этом плееры остаются нативными. Инструментарий пока находится на ранней стадии; на больших масштабах ещё не проверялся в продакшене.

Для видеопродуктов: выигрывает нативная разработка. Двойные затраты окупаются за 2–3 месяца, если у вас более 50 тысяч активных пользователей в день и есть прямой эфир. Для корпоративных приложений, где видео — лишь одна из функций, а не основной продукт, Flutter с кастомными видеомостами может быть оправдан, если команда хорошо разбирается в нативных модулях.

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

Разберём с вами компромиссы между стоимостью и сроками для вашего конкретного плана запуска.

Позвоните нам → Напишите нам →

Apple TV, Android TV, Tizen, Roku и стриминг на консолях

tvOS (Apple TV). Использует тот же AVPlayer, что и iOS; нативная поддержка HLS. Требуется отдельная иконка приложения для ТВ (1920×1080, 32 бита) и удобный механизм фокусировки для пульта. Поддержка Bluetooth-наушников для фонового воспроизведения отсутствует. Поддержка HDR включается автоматически, если кодек это позволяет.

Android TV / Google TV. Использует ExoPlayer. Поддержка протокола Cast (Chromecast) не обязательна, но пользователи её ожидают. Тайминговые метаданные — например, реклама и главы — передаются через EMSG-боксы в HLS или EventStream в DASH. Приложение должно пройти сертификацию для ТВ (использование безопасных шрифтов, навигация с пульта) перед публикацией в Google Play.

Tizen (Samsung TV). Проприетарная операционная система. Использует Tizen Player или кастомный HLS/ДЭШ через AVPlay API. Рекомендуется ДЭШ (поддержка PlayReady); HLS используется как резервный вариант. Поддержка субтитров зависит от версии SDK; парсинг WebVTT не всегда работает. Тестируйте на реальных устройствах Tizen — эмулятор неполный.

Roku. Закрытая платформа. Есть кастомный нативный SDK или веб-плеер на базе SceneGraph. По умолчанию используется DASH с защитой PlayReady, HLS — в качестве резервного варианта. Управление осуществляется с помощью пульта, жесты имитируют движение мыши. Монетизация (реклама, подписки) возможна только через систему Roku. Встроенные покупки Apple использовать нельзя.

Приложения на консолях (Xbox, PlayStation). PlayStation работает на Orbis OS, Xbox — на системе на базе Windows. На обеих платформах пока нет нативных SDK или обёрток на Electron. DRM зависит от платформы: на Xbox используется PlayReady, на PS5 — проприетарная система. Рынок небольшой — 1–2% зрителей, но аудитория очень вовлечённая: геймеры смотрят дольше.

Фоновое аудио, «картинка в картинке», AirPlay и интеграция с Cast

Фоновое аудио (iOS). Требуется категория AVAudioSession .playAndRecord или .playback + разрешение (entitlement). AVPlayer это учитывает — потоки продолжают работать, когда приложение в фоне. В plist нужно явно указать настройку и обосновать её в App Store: видеозвонки, аудиостриминг и подкасты проходят проверку, а «разблокировка музыки» — нет.

«Картинка в картинке» (PiP). iOS 13+: используйте AVPlayerViewController с canStartPictureInPictureAutomatically = true. Android: ExoPlayer 2.16+ поддерживает PiP из коробки через PictureInPictureParams. Веб: Fullscreen API не даёт полноценного PiP (на некоторых плеерах есть кнопка от браузера, например в hls.js 1.4+).

AirPlay (экосистема Apple). AVPlayer автоматически находит устройства, поддерживающие AirPlay — Apple TV, HomePod, AirPods. Дописывать код не нужно: просто покажите кнопку выбора устройства в AVPlayerViewController. Передача работает по локальной сети. На iOS 14 и выше требуется разрешение Local Network.

Chromecast (экосистема Google). Требуется Google Cast Framework (для Android) или Cast Sender SDK (для веба). ExoPlayer 2.17+ поддерживает интеграцию с Cast «из коробки»; hls.js требует отдельной обёртки cast.js. При кастинге локальное воспроизведение приостанавливается, а поток переключается на устройство Chromecast (отдельное приложение); синхронизация не гарантируется.

Для премиального опыта: закладывайте фоновое аудио, PiP и AirPlay/Cast как базовый минимум. Пользователи ожидают, что смогут свернуть приложение, заблокировать экран или вывести изображение на ТВ через AirPlay, не останавливая воспроизведение. Это проект на неделю на одну платформу, если начать вовремя; доработка после релиза займёт 2–3 недели и будет мучительной.

Доступность и субтитры — WebVTT, CEA-608 и IMSC1

WebVTT (стандарт HLS + веб). Текстовый формат субтитров; файл-спутник в HLS-манифесте. Поддерживается в AVPlayer (iOS), ExoPlayer (Android с плагином) и нативном <video> (веб). Поддерживает только базовое выравнивание — без расширенной стилизации. Надёжный и универсальный выбор.

CEA-608 (наследие вещания, встроено в видео). Скрытые субтитры, встроенные в видеопоток. Обязательны для эфирного вещания в США (требование FCC). AVPlayer обрабатывает CEA-608 автоматически; ExoPlayer требует плагин subriploader. Поддержка sidecar-файлов в tvOS ограничена; на Apple TV субтитры нужно планировать вручную.

IMSC1 (DASH + стилизация для вещания). Поддерживает богатую разметку: жирный шрифт, курсив, цвет, позиционирование. Соответствует спецификации DASH. У ExoPlayer поддержка IMSC ограничена; AVPlayer не обрабатывает IMSC нативно. В браузерах нет встроенного парсера IMSC — требуется кастомная JavaScript-библиотека, например ttml.js или niels-in-xsd. На платформах Tizen и Roku используются собственные вендорные парсеры.

Доступность за пределами субтитров. WCAG 2.1 уровня AA требует поддержки навигации с клавиатуры (в вебе), наличия метаданных для экранных дикторов (например, VoiceOver на iOS и TalkBack на Android) и соотношения контрастности цвета текста субтитров не менее 4,5:1. Большинство стриминговых плееров не передают состояние воспроизведения вспомогательным технологиям; обязательно протестируйте работу с VoiceOver и TalkBack перед релизом.

Тестирование и QA для кроссплатформенных стриминговых приложений

Лаборатории устройств. Кроссплатформенное видео невозможно протестировать без реальных устройств. Сервисы вроде BrowserStack, Sauce Labs и AWS Device Farm предоставляют доступ к физическим устройствам с реальными сетевыми условиями. Заложите 2–3 недели на подготовку тест-плана (сетевые профили для 4G, 3G, нестабильного Wi-Fi, 5G-домашнего интернета) и прогон всех комбинаций кодек/DRM/плеер.

Критичные сценарии для тестов. Переключение ABR (снижение битрейта при потере пакетов), ротация DRM-лицензий (каждые 60 минут на Widevine L3), восстановление после повреждения сегмента, вход и выход из PiP, подключение и отключение AirPlay/Cast, включение и выключение субтитров, уход в фон и возобновление воспроизведения, смена ориентации (с портретной на альбомную во время воспроизведения).

Что можно автоматизировать. Эмулируйте медленные сети (NetCat на iOS, tc qdisc на Android, Charles Proxy в вебе). Внедряйте ошибки сегментов (возвращайте 404 или 500 для сегмента N) и измеряйте время восстановления. Отслеживайте утечки памяти при 4-часовом воспроизведении (Instruments на iOS, Android Profiler на Android, Chrome DevTools в вебе).

Мини-кейс — BrainCert работает на масштабе на вебе, iOS, Android и tvOS

Задача. BrainCert нужно было приложение виртуального класса для репетиторства (видеозвонки 1:1, доска, запись), которое работало бы и на iPad в лекционных залах (100 пассивных зрителей на HLS), и на iPhone в дороге (плохой Wi-Fi, критичный заряд батареи). То же приложение на Android должно было справляться с Widevine L3 и китайскими устройствами с нестандартными реализациями mediacodec. В вебе всё должно было работать в Chrome и Safari без паритета кодеков.

Что мы сделали. Нативные приложения для iOS и Android; выделенная команда на каждую платформу. AVPlayer + CMAF-CBCS для iOS (рендиции H.264 и H.265); ExoPlayer + Widevine + запасная рендиция только в H.264 для бюджетных Android-устройств. Веб: hls.js для Chrome (HLS через CMAF), нативный <video> + hls.js для Safari. Субтитры — через sidecar WebVTT (универсальный запасной вариант). Фоновое аудио включено для сессий репетиторства.

Результат. Более 100 тысяч клиентов, свыше 500 млн минут занятий, TTFF в 95-м перцентиле < 2,5 с на всех платформах. Хотите аналогичную оценку для своего стека? Позвоните нам или напишите — разберём вашу стратегию по платформам.

Схема принятия решения — пять вопросов, чтобы оценить кроссплатформенный проект

В1. Вам нужен лайв-интерактив (WebRTC) или вещание (HLS/DASH)? Интерактив → нативный Swift/Kotlin, закладывайте бюджет на особенности платформ при работе с libwebrtc. Вещание → нативные плееры (AVPlayer, ExoPlayer), паритет между платформами добиться проще.

В2. Нужен ли DRM для лицензионного контента? Да → мульти-DRM с первого дня (FairPlay + Widevine + PlayReady, если есть ТВ); упаковка в CMAF-CBCS. Нет → отдавайте только резервную рендицию H.264, без DRM-инфраструктуры.

В3. Какая у вас минимальная версия iOS/Android? iOS 13–16 → только H.264; поддержка H.265 — опциональна. iOS 17+ → добавьте AV1 (проверьте влияние на батарею). Android 8–12 → H.264 обязателен; H.265 зависит от устройства. Android 13+ → добавьте VP9/AV1 для современных устройств.

В4. Опытна ли ваша команда в нативных видеофреймворках? Да → нативное приложение. Нет → наймите специалистов или выделите команду; избегайте видеомостов на RN/Flutter, если у вас нет 6+ месяцев на освоение.

В5. Нужны ли фоновое воспроизведение, PiP или кастинг? Да → только нативно (platform channels во Flutter/RN сложны). Нет → кроссплатформенные инструменты подходят, если кодеки поддерживаются легко (например, H.264).

Запутались в кроссплатформенной матрице кодеков и плееров?

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

Позвоните нам → Напишите нам →

Ошибки, которых стоит избегать при выпуске кроссплатформенного видео

1. Считать, что кроссплатформенные обёртки сами разберутся с детектированием кодеков. Не разберутся. Каждую платформу нужно опрашивать в рантайме — название устройства и версия ОС надёжными ориентирами не являются. Xiaomi на Android 12 может не декодировать H.265, тогда как Poco с той же ОС — декодирует.

2. Откладывать DRM на вторую или третью версию. Внедрение DRM занимает 4–6 недель на каждую платформу. Начинайте с CMAF-CBCS с самого начала: подпись манифеста и лицензионный сервер можно использовать на разных платформах и переиспользовать в будущем.

3. Тестировать сетевые условия на симуляторах. Полоса пропускания в симуляторе iOS — искусственная; эмулятор Android сильно нагружает CPU и может терять кадры, тогда как реальные устройства воспроизводят их плавно. Тестируйте на настоящих устройствах в 4G/3G через лабораторию устройств; проектируйте с учётом худшего RTT и потерь пакетов 2–5%.

4. Выпускать без согласованного scope для entitlement фонового аудио. Вы получите отказы Apple прямо во время запуска, если заявите фоновое аудио, но используете его для музыкального стриминга (отклоняют) вместо видеозвонков (одобряют). Сначала уточните у Apple, получите письменное подтверждение, а потом выпускайте.

5. Использовать один формат субтитров на всех платформах. WebVTT поддерживается везде, кроме Tizen, Roku и некоторых ТВ-платформ. Делайте субтитры в формате sidecar WebVTT, а для проблемных платформ используйте резервный вариант — CEA-608 или IMSC1; не привязывайтесь жёстко к одному формату.

KPI — что измерять, когда ваше кроссплатформенное приложение запущено

KPI качества. TTFF по платформам (iOS < 1,5 с, Android < 2 с, веб < 2 с), доля ребуферизации < 1% по платформам, средняя рендиция по кодеку (H.264 vs H.265 vs AV1), доля пропущенных кадров на Android < 2%. Разбивайте эти метрики по типу сети (4G, Wi-Fi, 3G) и классу устройства (флагман, средний сегмент, бюджет). Один тихий убийца: средняя рендиция падает на 20% неделя к неделе на одной платформе (признак: откат кодека или баг плеера).

Бизнес-метрики. Удержание пользователей по перцентилю качества опыта (QoE): если время первого кадра (TTFF) больше 3 секунд, удержание падает на 40%. Время просмотра по платформам: если на iOS смотрят дольше, чем на Android — это нормально; если на Android дольше — значит, проблема в плеере. Стоимость одного часа просмотра по кодеку: H.265 экономит 30–40% трафика при выходе (egress) по сравнению с H.264.

KPI надёжности. Доля успешных запусков потока — более 99% на платформу. Частота ошибок по типам (сбои переключения ABR, таймаут DRM-лицензии, 404 на сегменте) и доля сбоев — менее 0,1% (измеряется на сборку приложения, а не на платформу). Следите за лимитами сессий Widevine L3: если на одном устройстве постоянно возникают ошибки лицензии, значит, достигнут предел в 6 одновременных сессий.

Когда не стоит идти в кроссплатформенное видео

Видео — это функция, а не продукт. CRM со встроенными видеозвонками должна использовать SDK Daily или Twilio, а не создавать собственный плеер. Сложность кроссплатформенного видео не стоит одной кнопки звонка.

У вас нет специалиста по видео. Кроссплатформенное видео требует человека, который разбирается в кодеках, настройке DRM и API плееров разных платформ. Найти или привлечь такого специалиста дешевле, чем учиться самому и выпускать видео, которое не работает у половины пользователей.

Ваша цель — одна платформа (например, iPad для бизнеса, Chrome для веб-only SaaS). Делайте приложение нативно под эту платформу. Сложность растёт линейно: одна платформа в 100% проще двух.

Частые вопросы

Почему AV1 экономит трафик не на всех устройствах?

AV1 эффективнее H.264 по битрейту на 20–30%, но его декодирование сильно нагружает процессор. На iOS 16 и новее аппаратного декодера AV1 нет — программное декодирование расходует дополнительно 15–25% заряда в час. На Android поддержка AV1 на уровне железа зависит от устройства (например, Pixel 6+, S24, Snapdragon 8 Gen 1 и новее). Перед релизом обязательно проверьте влияние AV1 на расход батареи — для большинства пользователей H.265 остаётся лучшим выбором.

В чём разница между Widevine L1 и L3?

L1 расшифровывает ключи в защищённом анклаве (TEE); поток никогда не попадает в оперативную память. L3 расшифровывает программно; открытый ключ доступен операционной системе. На бюджетных Android-устройствах L3 означает, что поток можно записать через экранную запись. Если нужна защита уровня студии — используйте только L1, но предусмотрите возможность отката на незащищённый (DRM-отсутствующий) контент для устройств с L3, иначе вы лишите доступом половину пользователей Android.

Можно ли использовать React Native для стримингового приложения в 2026 году?

Да, если вы принимаете, что видеослой не «кроссплатформенный» — видеомосты на Kotlin и Swift всё равно придётся писать. Библиотека react-native-video отстаёт от возможностей платформ на 6–12 месяцев. Закладывайте 4–6 месяцев на разработку видеоинфраструктуры: экономия на коде приложения реальная, но сложность реализации плеера остаётся на уровне нативной разработки.

Как протестировать поддержку кодеков, не покупая каждое устройство?

Лаборатории устройств (BrowserStack, Sauce, AWS Device Farm) дают доступ к сотням реальных устройств. Чтобы протестировать поддержку кодеков, арендуйте 20–30 устройств (3 iPhone, 5 Android, 3 браузера, ТВ — при необходимости) и запустите на каждом часовой поток. Стоимость полного цикла тестирования — около 150 тыс. ₽; планируйте за 2–3 недели до релиза.

Что будет, если устройство пользователя не поддерживает кодек из моего манифеста?

Плеер запросит манифест, обработает его, не найдёт подходящую рендицию и выдаст ошибку. Чтобы этого избежать, всегда включайте рендицию H.264 как резервную. Если вы будете использовать только H.265 или AV1, 10–20% пользователей увидят сообщение «видео недоступно» и покинут сайт.

CMAF — это то же самое, что DASH?

Нет. CMAF — это формат упаковки (фрагментированные MP4-сегменты с опциональным шифрованием). DASH — это протокол (манифест + URL сегментов). CMAF можно использовать как для HLS (через HTTP Live Streaming), так и для DASH (через манифест MPEG-DASH), а также одновременно для обоих. CMAF с шифрованием CBCS позволяет одному набору сегментов обслуживать HLS, DASH и DASH-версию CMAF.

Зачем нужен отдельный чек-лист по субтитрам для каждой платформы?

У каждой платформы свои рендереры субтитров и уровень поддержки. AVPlayer на iOS нативно обрабатывает WebVTT; ExoPlayer на Android требует плагин SubtitleProvider; элемент <video> в вебе поддерживает WebVTT через теги <track>; у Tizen и Roku — собственные вендорные парсеры. Используйте WebVTT как универсальный запасной вариант, а для лучшего пользовательского опыта добавляйте платформенно-нативные форматы — например, CEA-608 на iOS и tvOS, IMSC1 в DASH.

Серверная часть

Масштабируемое стриминговое приложение: вызовы и решения

Egress, SFU, перекодировка, CDN — это серверная часть этой задачи.

Стратегия

Build vs Buy: переход с SDK на собственное видео

Схема из 5 вопросов для выбора между нативной разработкой, SaaS и гибридным решением.

Стоимость

Сколько стоит разработка стримингового приложения?

Бюджет по платформам и этапам: MVP, рост, масштабирование.

Миграция

Альтернатива Agora.io: собственный WebRTC + LiveKit

Playbook для перехода с дорогого ценообразования SDK.

Готовы выпустить кроссплатформенное стриминговое приложение, которое работает на всех устройствах?

Кроссплатформенное видео — это набор кодеков (резервный H.264 + версии H.265 и AV1), набор плееров (AVPlayer, ExoPlayer, hls.js, Shaka), набор систем защиты DRM (FairPlay, Widevine, PlayReady) и набор функций (фоновое воспроизведение, PiP, субтитры, поддержка доступности). Ошибка в одном из этих компонентов — и 30–50% зрителей просто уйдут.

Фора Софт выпустила полную матрицу совместимости для BrainCert и шести других продуктов за 21 год. Мы знаем, какая платформа становится узким местом для качества, где обещания кроссплатформенных SDK дают сбой и когда нативная разработка побеждает фреймворк. Если вы создаёте стриминговое приложение, переносите его между платформами или улучшаете качество пользовательского опыта — самый быстрый путь к надёжной архитектуре — это разговор с нашей командой.

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

Соберите матрицу кодеков и плееров правильно с первого раза

Разбор стратегии по платформам: лестница кодеков для ваших платформ, рекомендации по плеерам и чек-лист типичных проблем.

Позвоните нам → Напишите нам →

  • Технологии