Мой блог
Создание современного видеоплеера Frame Player: как я переосмыслил софт для просмотра видео
Все мы привыкли полагаться на классический софт вроде VLC, IINA или mpv, однако за последние годы стандарты интерфейсов ушли далеко вперед. Задавшись целью объединить современные технологии и надежную базу libmpv, я разработал собственный медиаплеер Frame Player под Windows и macOS, который решает актуальные бытовые задачи.
Познакомиться с проектом и изучить исходный код можно на официальной странице Frame Player, где также публикуются все обновления.








Дело не в плеерах, а в том, что изменилось вокруг
В 2012 году базовая задача для компьютера заключалась в том, чтобы просто открыть локальный файл и показать его на единственном мониторе. Современный пользовательский опыт устроен совершенно иначе. Мы транслируем контент в высоком разрешении на домашние телевизоры, смотрим кино синхронно с друзьями из других городов, выбираем нужные звуковые дорожки из десятка вариантов, запускаем видео прямо во время закачки торрентов и ожидаем мгновенного пропуска назойливых опенингов.

Стандартные программы до сих пор превосходно справляются с открытием файлов, но оставляют массу сопутствующих ежедневных неудобств на плечах зрителя. Именно поэтому разработка Frame Player велась с упором на автоматизацию привычных рутинных сценариев и устранение технических барьеров.
Интерфейс, который не выглядит как что‑то из 2012 года
Исторически архитектура плееров заставляла разработчиков либо рисовать элементы управления силами самого движка вывода видео с жесткими ограничениями типографики, либо выстраивать интерфейс нативными средствами операционной системы. Во Frame Player я задействовал гибридную схему: mpv рендерит картинку в нативное дочернее окно, а весь графический интерфейс работает через прозрачный webview поверх него.

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

Телевизор, который не хочет проигрывать ваш файл
Отправка медиафайла на телевизор часто обрывается черным экраном или вызывает критические задержки из-за фонового перекодирования. Технологии Google Cast и DLNA работают по-разному, причем DLNA крайне чувствителен к точным MIME-типам и вариациям написания контейнеров. Мой плеер предварительно опрашивает принимающее устройство, сверяет поддерживаемые форматы и прямо в интерфейсе сообщает вердикт: уйдет ли файл «как есть», потребуется ли легкая перепаковка или воспроизведение невозможно.

Кино вдвоём, когда вы в разных городах
Совместный просмотр фильмов через демонстрацию экрана в мессенджерах часто страдает от падения битрейта на темных сценах или блокировок со стороны DRM. Во Frame Player встроена децентрализованная система синхронизации через легкий Relay-сервер на Go. Участники запускают собственные локальные копии файлов, а по сети передаются лишь контрольные слепки состояния воспроизведения. При небольшом рассинхронизаторе скорость временно корректируется на пару процентов, а если у одного из зрителей начинается буферизация, пауза автоматически ставится всем участникам сеанса.

Субтитры, которые разъезжаются
Проблема рассинхронизации субтитров кроется не только в постоянном смещении, но и в разнице исходной частоты кадров — например, между старыми европейскими релизами на 25 fps и современными на 23,976 fps. Обычная кнопка задержки здесь бессильна, поэтому Frame Player умеет автоматически искать подходящие файлы субтитров на OpenSubtitles по уникальному хешу, предлагать корректное растяжение таймингов и запоминать индивидуальные настройки для каждого отдельного видеофайла.

Дорожка, которую помнят по описанию, а не по номеру
Переключение серий в любимых сериалах часто сбрасывает выбранный пользователем дубляж из-за изменения порядковых номеров дорожек в контейнере. Во Frame Player выбор запоминается на уровне всей папки на основе текстового описания, языка и кодека, а не жесткой позиции. Программа автоматически подбирает наиболее близкий вариант в следующем файле и учитывает стандартные правила фильтрации дублирующих дорожек.

В стримингах есть «пропустить вступление». Почему её нет в плеерах?
Локальные видеофайлы обычно не имеют облачной разметки опенингов, однако многие качественные релизы содержат детально подписанные главы: Opening, Recap, Credits и другие. Если название текущей главы совпадает со стоп-листом служебных меток, в первые секунды проигрывания во Frame Player появляется удобная кнопка пропуска, которая избавляет зрителя от ручной перемотки таймлайна.
Торрент, который можно смотреть сейчас
Плеер способен напрямую открывать торренты без предварительного скачивания всего объема данных. Загрузка байт жестко следует за текущим положением ползунка воспроизведения, отдавая приоритет сегментам прямо перед курсором. При этом раздача по умолчанию отключена ради безопасности пользователей из юрисдикций со строгим копирайтом, а для обхода сетевых ограничений предусмотрена поддержка шифрования MSE, SOCKS5-прокси и привязки к конкретному сетевому интерфейсу.
Картинка: почему на маке темнее и что делать с полосами
Многие пользователи замечают разницу в яркости при воспроизведении контента через mpv и нативный QuickTime. Проведя детальные замеры градаций серого, я выяснил особенности гамма-кривых и добавил в настройки переключатель между стандартным профилем mpv и более мягкой кривой macOS. Дополнительно плеер самостоятельно анализирует черные поля в кадре для корректного кадрирования изображения.
Разработка велась на базе Tauri 2 и Svelte 5 с открытым исходным кодом под лицензией GPL-3.0. Проект создан как инструмент для тех, кто ценит современные стандарты взаимодействия с медиаконтенте без лишних компромиссов.
