Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Создание современного видеоплеера Frame Player: как я переосмыслил софт для просмотра видео

Создание современного видеоплеера Frame Player: как я переосмыслил софт для просмотра видео

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

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

Сравнение панелей управления различных медиаплееров
Панели управления рядом друг с другом: mpv, VLC, IINA и Frame Player
Декоративная иллюстрация
Архитектура программных компонентов
Декоративная иллюстрация
Системные настройки приложения
Декоративная иллюстрация
Настройка сетевых интерфейсов
Декоративная иллюстрация
Инструменты отладки кода
Декоративная иллюстрация
Сборка проекта под разные платформы
Декоративная иллюстрация
Оптимизация производительности
Декоративная иллюстрация
Финальная демонстрация софта
Декоративная иллюстрация
Интерфейсные элементы управления

Дело не в плеерах, а в том, что изменилось вокруг

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

Реклама
Демонстрация контекстного меню и интерфейса Frame Player
Демонстрация интерфейса Frame Player, включая контекстное меню

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

Реклама

Интерфейс, который не выглядит как что‑то из 2012 года

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

Меню трансляции видео на телевизор в приложении
Меню отправки видео на TV. Плеер сразу понимает, какой файл можно проиграть «как есть», а для какого нужна переупаковка

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

Страница подключения к комнате Watch Together
Страница захода в комнату Watch Together. Ссылку можно удобно отправить друзьям

Телевизор, который не хочет проигрывать ваш файл

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

Инструмент поиска субтитров через OpenSubtitles
Интерфейс поиска субтитров на OpenSubtitles

Кино вдвоём, когда вы в разных городах

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

Кнопка пропуска вступления по таймкодам глав
Пропуск вступления — определяется по названию главы, проверено на различных эдж‑кейсах

Субтитры, которые разъезжаются

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

Визуальная карта буфера торрента на таймлайне
Tears of Steel, свободный фильм Blender Foundation. Полосы на таймлайне — карта буфера: в приоритете скачиваются куски ближе к текущему месту проигрывания

Дорожка, которую помнят по описанию, а не по номеру

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

Декоративная иллюстрация
Рабочий процесс создания мультимедийного ПО

В стримингах есть «пропустить вступление». Почему её нет в плеерах?

Локальные видеофайлы обычно не имеют облачной разметки опенингов, однако многие качественные релизы содержат детально подписанные главы: Opening, Recap, Credits и другие. Если название текущей главы совпадает со стоп-листом служебных меток, в первые секунды проигрывания во Frame Player появляется удобная кнопка пропуска, которая избавляет зрителя от ручной перемотки таймлайна.

Торрент, который можно смотреть сейчас

Плеер способен напрямую открывать торренты без предварительного скачивания всего объема данных. Загрузка байт жестко следует за текущим положением ползунка воспроизведения, отдавая приоритет сегментам прямо перед курсором. При этом раздача по умолчанию отключена ради безопасности пользователей из юрисдикций со строгим копирайтом, а для обхода сетевых ограничений предусмотрена поддержка шифрования MSE, SOCKS5-прокси и привязки к конкретному сетевому интерфейсу.

Картинка: почему на маке темнее и что делать с полосами

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

Разработка велась на базе Tauri 2 и Svelte 5 с открытым исходным кодом под лицензией GPL-3.0. Проект создан как инструмент для тех, кто ценит современные стандарты взаимодействия с медиаконтенте без лишних компромиссов.

01.