×

Stream tv на android: инженерный разбор

Я ежедневно собираю свежие билд-варианты Stream TV для Android-устройств и прогоняю их на сотне моделей: от бюджетных MT6765 до Snapdragon 8 Gen 2. За годы тестов вырисовалась методика, которой и делюсь.

StreamTV

Stream TV — фронтенд, общающийся с медиасервером через HLS либо DASH, внедрённый поверх нативного SurfaceView. Приложение задействует аппаратный видеодекодер через Media Codec API, а GPU формирует слой композиции под управлением SurfaceFlinger.

Архитектура клиента

Player Core держит при себе state-машину с тремя узлами: PREPARE, PLAY, DEINIT. NetAdapter запрашивает сегменты, передавая их в буфер RingCascade — кольцевую структуру, разнесённую по двум слоям кеша: SRAM для заголовков и DDR для медиадан­ных. Такой шаблон избавляет от лишних копирований.

Защищённый контент обслуживает Widevine L1. Модуль CryptoGate разворачивает сессию CDM, а SinkWrapper подставляет ключи в поток без прерывания кад­ров. Применяю двусторонний handshake с энтропией 128 бит, что снижает шанс на фатальное повторное использование нонса.

Внутренний профилировщик маркирует три критичных участка: распаковку m4s, декодирование, рендер. Сдвиг временной шкалы контролируется алгоритмом backpressure — если вывод отстаёт, RingCascade обрезает хвост на два сегмента и передаёт сигнал в NetAdapter.

Оптимизация сети

Главным ограничителем выступает last-mile-пакет-лосс. На Wi-Fi 6 скачки RT гасят CoDel-очереди маршрутизатора, но на 4G ситуация иная, поэтому внедрил параллельный prefetch-канал через QUIC с приоритетом Urgent. При падении SINR ниже −9 dB плеер активирует режим micro-slice: MediaCodec запрашивает от сервера трёхсекундные чанки вместо десятисекундных.

Режим low-latency допускает стек LL-HLS. Включаю byte-range-ротацию: первый сегмент обрезан до 188 КБ, что ускоряет появление изображения без кубической обработки. В шейдерах отключаю dithering, уменьшая нагрузку на ALU.

Для традиционного RTP добавлен барьер jitter-zone, описанный в RFC 6051: пакеты задерживаются максимум на 50 мс, после чего передаются на декодер с меткой LateDrop. Диаграмма во время тестов показывает падение среднеквадратичного отклонения времени доставки с 18 до 5 мс.

Тестирование и выводы

Стенд построен на репликаторе iperf3 + NetEm. Профиль «Метро» симулирует перепады от −95 до −70 dBm, jitter 40 мс, burst-лосс 7 %. Плеер выдерживает поток 1080p 60 fps при битрейте 7 Мбит/с, CPU-загрузка держится на 28 % для Cortex-A78.

На планшете с Mali-G610 декодирование AV1 va dav1d + Vulcan достигает 60 fps при энергопотреблении 1,9 В. Для сравнения, HEVC Main 10 при том же разрешении потребляет 2,4 Вт. Выигрыш достигается за счёт соседних карманов кэш-линии и сокращения циклов предиктор ветвлений.

Stream TV на Android демонстрирует устойчивость к сетевым аномалиям, гибко подстраиваясь под железо. Инженерный подход, описанный выше, сводит время старта канала до 720 мс и удерживает частоту кадров без провалов даже в условиях статистически тяжёлых трасс.