🔖Улучшение воспроизведения видео с помощью ExoPlayer
Команда Reddit поделилась практическими советами по оптимизации видео на Android, подкреплёнными реальными production-данными. Разбираем ключевые находки.
🔸Доставка контента: MP4 vs DASH
75% видео на Reddit длятся менее 45 секунд. Команда провела эксперимент: для коротких роликов заменили адаптивный DASH на обычный MP4.
Результаты для видео < 45 сек:
• Ошибки воспроизведения: -5,5%
• Выход до старта видео: -2,5%
• Общие просмотры: +1,7%
Вывод: для короткого контента адаптивные протоколы избыточны — MP4 быстрее и надёжнее.
🔸Кэширование: подводные камни
Проблемы SimpleCache:
• ExternalDir недоступен везде (например, на OPPO) — лучше использовать internalDir
• Может удалять другие файлы — нужна отдельная папка
• Бьёт по диску в конструкторе — создавайте в фоновом потоке
• URL как ключ — если у вас разные сигнатуры, нужна своя фабрика ключей
🔸Предзагрузка контента
Протестировали варианты: следующее видео, два параллельно, только MP4. Лучше всего сработала предзагрузка только следующего видео:
• Загрузка < 500ms: +1,9%
• Загрузка > 1000ms: -0,872%
Попытка учитывать пропускную способность (2-20 Мбит/с) провалилась — метрики ухудшились.
🔸LoadControl: настройка буферизации
По умолчанию значения буфера в ExoPlayer слишком большие для коротких видео. Reddit снизил:
•
bufferForPlaybackAfterRebufferMs: 1000ms•
minBuffer и maxBuffer: 20000msРезультаты:
• Загрузка < 250ms: +2,7%
• Загрузка < 500ms: +4,4%
• Загрузка > 1000ms: -11,9%
• Ребуферинг: -4,8%
• Общие просмотры: +1,5%
Самый впечатляющий эксперимент!
🔸BandwidthMeter и адаптивный битрейт
Проблема: предзагрузка через DownloadManager не учитывалась в общей пропускной способности. После фикса:
• Разрешение видео: +1,4%
• Просмотры в цепочке: +0,5%
• Смена битрейта: -0,5%
• Загрузка > 1000ms: +0,3% (компромисс)
🔸Декодеры
Ошибка 4001 (декодер недоступен) — частая проблема. Решения:
• Включить fallback на программный декодер
• Запрашивать audio focus явно
• Рассмотреть пул плееров или один экземпляр
Fallback снизил ошибки на 0,9%.
🔸Рендеринг: SurfaceView vs TextureView
SurfaceView эффективнее (рендерит на GPU напрямую), но до Android N были проблемы с анимациями.
В Compose постоянное re-inflation занимало до 30ms. Решение — собственный ViewPool:
• Загрузка < 250ms: +1,7%
• Просмотренные минуты: +1,4%
• P50 создания: улучшено в 30 раз (1ms)
🔸Ключевой вывод
Всё упирается в аналитику и A/B-тесты. Обязательные метрики:
• Время до первого кадра
• Ребуферинг
• Старт/стоп воспроизведения
• Ошибки
ExoPlayer предоставляет
AnalyticsListener для трекинга.📎 Статья
🎙 Новости
📝 База вопросов