TGViewer
YeaHub Tech YeaHub Tech @yeahub_tech · 412 subscribers
Post #268 100
#Video

🔖Улучшение воспроизведения видео с помощью 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 для трекинга.


📎 Статья

🎙 Новости

📝 База вопросов
  • ❤ 1
More from @yeahub_tech
  1. Oct 9, 2026#Собес #pipeline #ci #stage 🤔 Что происходит при автоматической сборке feature-ветки на s…
  2. Oct 8, 2026#course #задачи #тесты 📚 JavaScript. A3 Задачи Задачи на программирования на языке JavaSc…
  3. Oct 7, 2026#course #начинающие 📚 Твой Golang Твой Golang — это идеальный старт для освоения языка. П…
  4. Oct 5, 2026🧑‍💻 Вопросы с собесов для Node.js Разработчика 1. Как использовать Service Workers для р…
  5. Oct 2, 2026#Собес #transaction #propagation #required 🤔 Что такое propagation у транзакций и какие т…
  6. Oct 1, 2026#book #book 📚 Библия C#. 6-е изд. Автор: Михаил Фленов Это настольная книга программиста,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →