Добавить в корзинуПозвонить
Найти в Дзене
Кодовые решения

AVI на Android в 2026 году? Как я собрал свой FFmpeg, чтобы заставить «древние» форматы летать на Android TV

Казалось бы, на дворе 2026 год. Мы повсюду обсуждаем колонизацию Марса, генеративные нейросети пишут за нас куски кода, а стриминговые платформы вовсю продвигают трансляции контента в разрешении 8K. Кто вообще в здравом уме и твердой памяти сегодня вспоминает про формат AVI, пик популярности которого пришелся на эпоху ламповых мониторов и первых дисков DivX? Оказалось — огромное количество людей. Когда я начал активно развивать свой независимый медиацентр VidraPlayer, ориентируясь на современный стек технологий, чистоту архитектуры и публикацию в RuStore, мне в личку на моем сайте и в социальных сетях буквально посыпались вопросы от реальных пользователей. «Алексей, а мой архив семейных записей с 2003–2005 годов откроется?»
«Почему все современные плееры вылетают или зависают при попытке прожевать старый сериал, скачанный во времена расцвета торрентов?»
«У меня на домашнем сервере терабайты старых оцифрованных VHS-кассет в AVI, и ни один плеер на новом Android TV нормально их не играет
Оглавление

Казалось бы, на дворе 2026 год. Мы повсюду обсуждаем колонизацию Марса, генеративные нейросети пишут за нас куски кода, а стриминговые платформы вовсю продвигают трансляции контента в разрешении 8K. Кто вообще в здравом уме и твердой памяти сегодня вспоминает про формат AVI, пик популярности которого пришелся на эпоху ламповых мониторов и первых дисков DivX?

Оказалось — огромное количество людей. Когда я начал активно развивать свой независимый медиацентр VidraPlayer, ориентируясь на современный стек технологий, чистоту архитектуры и публикацию в RuStore, мне в личку на моем сайте и в социальных сетях буквально посыпались вопросы от реальных пользователей.

«Алексей, а мой архив семейных записей с 2003–2005 годов откроется?»
«Почему все современные плееры вылетают или зависают при попытке прожевать старый сериал, скачанный во времена расцвета торрентов?»
«У меня на домашнем сервере терабайты старых оцифрованных VHS-кассет в AVI, и ни один плеер на новом Android TV нормально их не играет. Поможешь?»

Я, как разработчик, который искренне топит за надежную архитектуру, отсутствие «мусора» в коде и максимальную пользу для конечного пользователя, не мог просто отмахнуться дежурной фразой в стиле техподдержки крупных корпораций: «Формат устарел, сконвертируйте ваши файлы в MP4». Софт должен подстраиваться под человека, а не человек под софт.

Поэтому я засучил рукава, открыл терминал и полез глубоко под капот Android-систем, чтобы решить эту проблему раз и навсегда.

Проблема: Почему современные Android-приставки и Smart TV «давятся» старым добрым AVI?

Чтобы понять суть проблемы, нужно вспомнить, как устроена работа с видео на современном Android. Большинство популярных плееров из сторов идут по пути наименьшего сопротивления: они используют либо стандартные системные медиа-библиотеки операционной системы, либо дефолтную сборку ExoPlayer от Google (или его преемника Media3).

Эти инструменты создавались в эпоху мобильного интернета и стриминга. Они безупречно, на аппаратном уровне, заточены под современные стандарты: кодеки H.264 (AVC), H.265 (HEVC), AV1 и контейнеры MP4 или MKV. Железо современных процессоров в ТВ-приставках содержит выделенные микросхемы для мгновенного декодирования именно этих потоков.

Но стоит вам скормить такому «современному» плееру старый AVI-файл из начала двухтысячных, как начинается парад багов и графических аномалий:

  1. Эффект «черного экрана»: Звуковая дорожка (обычно простенький MP3 или AC3) воспроизводится идеально, а вместо картинки — статичная темнота. Системный декодер устройства просто понятия не имеет, как расшифровать видеопоток, закодированный древним DivX 3, 4, 5 или Xvid.
  2. Дикий рассинхрон звука и картинки: Картинка внезапно превращается в дерганое слайд-шоу из трех кадров в секунду, процессор приставки раскаляется, пытаясь программно обработать тяжелый поток, а звук при этом убегает далеко вперед. Смотреть такое физически невозможно.
  3. Краш приложения (Out of Memory / Segmentation Fault): Плеер пытается применить современные алгоритмы буферизации к специфической структуре AVI, память переполняется, и приложение просто «схлопывается», выбрасывая пользователя на главный экран Android TV.

Большинство инди-разработчиков и крупных студий закрывают на это глаза. Их логика понятна: зачем тратить сотни часов на поддержку форматов двадцатилетней давности? Но у меня был другой вызов. Я пишу VidraPlayer как бескомпромиссный инструмент, который должен без лишних вопросов воспроизводить абсолютно всё, что ему дают.

Решение: Своя сборка FFmpeg под капотом ExoPlayer

Поняв, что стандартными методами и библиотеками Android TV старые форматы не победить, я принял решение идти по самому хардкорному, но честному пути. В качестве базы для интерфейса, логики фокуса пульта и обработки высокоуровневых медиа-вызовов я оставил мощный и гибкий ExoPlayer. А вот его «сердце» — движок декодирования потоков — я решил полностью переписать.

Я интегрировал в проект собственную низкоуровневую сборку FFmpeg, написанную на C/C++ и скомпилированную вручную через Android NDK (Native Development Kit) строго под целевые архитектуры процессоров: ARMv7 (для старых ТВ-приставок) и ARM64 (для современного железа).

Вот какая логика была реализована внутри VidraPlayer благодаря этому шагу:

  • Умная автодетекция контейнеров и кодеков: Теперь перед запуском любого видеофайла плеер не просто слепо передает его операционной системе. Он мгновенно «опрашивает» заголовки файла. Если внутри обнаруживается современный поток H.264 в MKV, плеер запускает стандартное аппаратное ускорение (MediaCodec), экономя ресурсы процессора. Но если система видит старый AVI с кодеком Xvid, VidraPlayer не паникует и не падает в краш — он за долю секунды бесшовно переключает воспроизведение на мой кастомный нативный движок FFmpeg.
  • Глубокая оптимизация под слабое железо Smart TV: Телевизоры и приставки — это не современные флагманские смартфоны. Там часто стоят крайне бюджетные процессоры с минимальной частотой и жестким ограничением по оперативной памяти. Если запустить на них «дефолтный» FFmpeg из готовых библиотек, интерфейс начнет безбожно лагать. При компиляции я применил жесткую оптимизацию компилятора Clang (-O3, -flto, специфические флаги оптимизации векторизации NEON для процессоров ARM). Программное декодирование старых AVI-форматов теперь происходит настолько плавно, что интерфейс плеера, написанный на современном декларативном фреймворке Jetpack Compose, сохраняет стабильные 60 кадров в секунду. Никаких фризов при вызове меню или перемотке.

Шаг вперед: Домашняя мультимедийная сеть вместо флешек

Раз уж под капотом плеера появился столь мощный и всеядный движок, я решил пойти дальше и закрыть еще одну извечную боль владельцев Smart TV — процесс передачи файлов.

Согласитесь, в 2026 году бегать с флешкой или внешним жестким диском от компьютера к телевизору, чтобы посмотреть старый фильм или сериал, — это какой-то первобытный век. А настраивать тяжелые, неповоротливые медиасерверы на домашнем ПК умеет далеко не каждый, да и ресурсы компьютера они отжирают знатно.

Я внедрил в VidraPlayer архитектуру, которая позволяет в пару кликов развернуть локальную домашнюю мультимедиа-сеть.

Как это работает на практике?
Вы устанавливаете VidraPlayer на все свои устройства в доме: на Android-телевизор, на смартфон и на планшет. Приложение умеет сканировать локальную сеть по кастомным протоколам и находить расшаренные папки на вашем домашнем компьютере или ноутбуке (будь то Windows, macOS или Linux).

В итоге все устройства связываются в единую экосистему:

  • Ваш старый архив видео лежит на жестком диске ПК в кабинете.
  • Вы ложитесь на диван в гостиной, включаете телевизор, открываете VidraPlayer и сразу видите структуру папок вашего ПК.
  • Нажимаете «Play» на пульте — и кастомный движок с FFmpeg начинает стримить и декодировать этот файл прямо по воздуху (через локальный Wi-Fi).
  • Нужно уйти на кухню? Берете в руки планшет или смартфон, открываете то же приложение и продолжаете просмотр с того же места. Никаких проводов, никакого копирования файлов туда-сюда, никакого ожидания.

Свой путь против готовых пакетов на Kotlin: Честный разбор

В современном Android-сообществе разработчиков ручная сборка нативных C++ библиотек считается чем-то вроде черной магии. На рынке есть десятки готовых Kotlin/Java оберток для видео. Достаточно прописать одну строчку implementation в файле build.gradle, и всё заработает само за 5 минут.

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

Плюсы моего хардкорного подхода:

  1. Абсолютная независимость от вендора устройства: Если условный бренд приставки сэкономил центы на лицензиях и вырезал поддержку определенных аудио- или видеодекодеров на уровне прошивки, обычному плееру придет конец. Моему плееру абсолютно всё равно, что там накуролесили китайские инженеры в прошивке вашего телевизора. Все необходимые «мозги» и кодеки для воспроизведения я упаковал внутрь самого приложения.
  2. Тотальный контроль над весом и безопасностью: Популярные сторонние медиа-пакеты — это «черный ящик». Они часто тащат за собой мегабайты неиспользуемого кода, устаревшие зависимости и, что самое неприятное, скрытые аналитические трекеры, которые собирают данные о пользователе и отправляют их на зарубежные сервера. Компилируя FFmpeg самостоятельно, я полностью очистил код от шелухи. Я оставил только те модули, которые реально нужны для чистой производительности и качества картинки, гарантируя стопроцентную приватность.
  3. Прямая оптимизация под архитектуру процессора (ABI): Вместо универсального кода, который «как-то работает везде», моя сборка знает, как эффективно загрузить конкретные ядра процессора вашего Android TV.

Минусы (обратная сторона медали):

  1. Колоссальная сложность поддержки: Если Google в очередной раз радикально обновит правила Android NDK или поломает обратную совместимость в новых версиях Android, сторонние авторы библиотек обновят свои пакеты сами. Мне же придется садиться за исходники C++ и пересобирать весь движок вручную. Это долго, сложно и требует специфических инженерных знаний.
  2. Размер APK-файла: Нативные скомпилированные библиотеки (.so файлы под разные архитектуры процессоров) неизбежно увеличивают итоговый размер установочного файла приложения. VidraPlayer весит чуть больше, чем плееры, использующие только системные костыли Android. Но я считаю, что лишние 20–30 мегабайт в 2026 году — это мизерная и абсолютно оправданная плата за полную автономность и всеядность приложения.
  3. Затраты времени: На то, чтобы корректно подружить высокоуровневый Kotlin-код через прослойку JNI (Java Native Interface) с низкоуровневыми C-структурами FFmpeg, у меня ушло примерно в три раза больше чистого времени разработки, чем на проектирование и написание всего визуального интерфейса приложения на Jetpack Compose.

Философия проекта: Зачем всё это нужно?

Как я регулярно пишу в своем подробном техническом блоге-дневнике (DevLog) на страницах сайта artemcode.ru, я создаю VidraPlayer не ради того, чтобы сделать очередной «клон» системного плеера, коих тысячи в Google Play и RuStore. Моя цель — построить идеальный, монументальный архитектурный фундамент для домашнего мультимедиацентра.

Использование готовых пакетов на Kotlin хорошо для коммерческих студий, которым нужно выпустить быстрый продукт-однодневку (MVP), показать инвесторам и начать крутить там рекламу. Мой проект — это история про инди-разработку, про философию «чистого кода» и уважение к пользователю. В VidraPlayer нет навязчивых баннеров, нет платных подписок, нет обязательной регистрации и сбора ваших личных логов. Есть только вы, ваш телевизор и ваше видео. Любого формата, любого года выпуска и из любого источника.

Что в итоге?

Тяжелый этап проектирования, компиляции движка и тестирования локальной сети позади. Обновленный, хардкорный движок уже полностью интегрирован в приложение и стабильно выполняет свою работу.

Сейчас VidraPlayer официально доступен для скачивания в магазине приложений RuStore. Проект живет и развивается по прозрачному, честному принципу: я сталкиваюсь с реальной проблемой пользователя (или нахожу баг) — анализирую — пишу код — выкатываю обновление.

Если у вас на антресолях, в шкафу или на старом жестком диске компьютера пылится архив видеозаписей двадцатилетней давности, до которых никак не доходили руки из-за вечных проблем с кодеками — сдуйте с них пыль и дайте им второй шанс. Мой плеер их точно увидит и воспроизведет в лучшем виде.

А теперь вопрос к моим читателям: какой самый старый видеофайл до сих пор хранится в вашей цифровой коллекции? Помните, на какую камеру или телефон он был снят? Пишите расширения и кодеки файлов в комментариях — устроим моему кастомному движку FFmpeg настоящий стресс-тест!

Если вам интересна внутренняя техническая кухня мобильной разработки, борьба с обработкой фокуса пульта в Jetpack Compose или флаги оптимизации компиляторов — заглядывайте на мой персональный сайт artemcode.ru. Там я выкладываю полную изнанку кода без купюр.