Российские технологии и цифровая экономика
ПоискRSS

Qtavplayer и ffmpeg: развитие мультимедиа в qt и сравнение с qt6multimedia

5 минут чтения

От Qt5Multimedia до QtAVPlayer: как FFmpeg изменил мультимедиа в Qt

Во времена, когда развитием Qt занималась Nokia, разработчики нередко шли на смелые архитектурные решения. Одним из таких проектов стал QMediaPlayer, появившийся в составе Qt5Multimedia. Его задача заключалась в воспроизведении аудио- и видеофайлов через подключаемые программные плагины. Такой подход позволял сначала сформировать публичный API, а реализацию конкретной платформы добавить позднее.

На практике это означало, что интерфейсы Qt могли существовать даже в тех системах, где полноценный медиастек ещё не был готов. Однако у подобной модели была серьёзная проблема: публичный API нельзя просто удалить или радикально изменить в следующей мажорной версии. В результате в Qt закреплялись функции, которые на отдельных платформах работали частично, нестабильно или отсутствовали вовсе.

Первым заметным бэкендом стал GStreamer, изначально ориентированный главным образом на Linux. Для встроенных устройств это был вполне рациональный выбор: Embedded Linux активно использовал GStreamer, а необходимые gst-плагины обычно присутствовали в прошивке. При этом Windows и macOS долгое время не считались приоритетными направлениями.

Со временем различия между платформами стали слишком заметными. Один и тот же QMediaPlayer мог вести себя совершенно по-разному в зависимости от операционной системы: где-то воспроизводился только звук, где-то не поддерживались отдельные форматы, а где-то видео не запускалось вовсе. Попытка перенести GStreamer на Windows и другие системы лишь показала, что его нельзя считать полностью кроссплатформенным без полноценной реализации всех компонентов под конкретную платформу.

На этом фоне Wang Bin создал QtAV - альтернативный медиаплеер на базе FFmpeg. Он задумывался как более гибкая замена тяжёлому и непредсказуемому Qt5Multimedia, причём с поддержкой не только Qt 5, но и Qt 4. Изначально казалось, что QtAV и стандартный мультимедийный модуль Qt займут разные ниши. Однако пользователи всё чаще выбирали QtAV, несмотря на его нестабильность и накопившиеся ошибки.

Идея использовать FFmpeg в качестве альтернативного бэкенда для Qt5Multimedia долго воспринималась негативно. В период активной разработки Qt 6 ситуация осложнялась ещё сильнее: выпуск Qt6Multimedia некоторое время вообще не был гарантирован, поэтому о полноценной замене старого мультимедийного стека старались не говорить.

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

Отдельным преимуществом стала возможность выводить изображение в QML или QWidget независимо от внутренней логики плеера. В старой архитектуре для этого приходилось обращаться к приватным интерфейсам Qt5Multimedia, что было крайне рискованно: такие API могли измениться без предупреждения и не гарантировали стабильность при обновлении Qt.

Пользователи QtAV тем временем сталкивались с большим количеством ошибок и плохо тестируемым кодом. Поэтому QtAVPlayer стал для многих практичной альтернативой в проектах на Qt 5. Иногда его ошибочно называли обновлённой версией QtAV, которая лишь получила поддержку новых релизов FFmpeg. На самом деле архитектурно это другой проект, во многом опирающийся на идеи FFmpeg и ffplay.

Позднее ситуация изменилась с выходом Qt 6.5: FFmpeg стал стандартным бэкендом Qt6Multimedia. В модуле появились QVideoSink и QAudioSink, заметно упростившие интеграцию с внешними компонентами. Для QtAVPlayer это оказалось особенно полезным: теперь стало проще подключать QRhi и использовать аппаратно ускоренный рендеринг без обращения к нестабильным внутренним механизмам Qt.

Если аппаратное ускорение включено, декодирование выполняется на GPU, а видеокадр содержит не копию пикселей, а дескриптор ресурса, зависящий от платформы. В Linux и Android это может быть объект OpenGL, в Windows - D3D11Texture2D, а в macOS - ресурс Metal. Такой подход уменьшает количество копирований между CPU и GPU и снижает нагрузку на систему.

Кадр QAVVideoFrame можно преобразовать в QVideoFrame из QtMultimedia без копирования данных. QRhi способен напрямую работать с подобными ресурсами, реализуя так называемый zero-copy pipeline. Это особенно важно для 4K-видео, многопоточной обработки и приложений, где задержка вывода должна быть минимальной. Подробное обсуждение архитектуры и возможностей проекта доступно в материале о [разработке медиаплеера на Qt](https://habr.com/ru/articles/1080420/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080420).

Зачем нужен QtAVPlayer при наличии Qt6Multimedia

Главное различие между Qt6Multimedia и QtAVPlayer заключается в уровне доступа к FFmpeg. В Qt6Multimedia FFmpeg является внутренним механизмом. Разработчик пользуется высокоуровневым API Qt и не обязан знать, какие именно объекты создаются внутри бэкенда.

QtAVPlayer, напротив, делает FFmpeg частью публичной модели программирования. Приложение получает доступ к AVPacket, AVFrame, AVFormatContext, AVCodecContext и другим структурам. Это позволяет управлять всей цепочкой обработки: от открытия контейнера и декодирования до фильтрации, кодирования и записи результата в файл.

Именно поэтому QtAVPlayer интересен не только как Qt видеоплеер. Его можно использовать в видеоредакторах, системах видеонаблюдения, медиаконвертерах, трансляционных комплексах и приложениях для анализа видеопотоков. Когда требуется просто воспроизвести ролик, возможностей Qt6Multimedia обычно достаточно. Но при нестандартной обработке данных его закрытая внутренняя архитектура быстро становится ограничением.

Отдельно стоит выделить поддержку filter_complex. Эта возможность FFmpeg позволяет строить сложные графы обработки, объединять несколько аудио- и видеопотоков, накладывать эффекты, менять разрешение, выполнять цветокоррекцию и использовать аппаратно ускоренные фильтры. Для проекта, которому необходим полный контроль над медиаданными, это значительно важнее простой функции запуска файла.

При выборе технологии необходимо учитывать и цену такой свободы. Прямое использование FFmpeg требует понимания форматов, потоков, временных меток, буферизации, синхронизации аудио и видео, а также особенностей аппаратных API. QtAVPlayer снижает объём рутинной работы, но не отменяет необходимости разбираться в устройстве мультимедийного конвейера.

Сегодня Qt-мультимедиа развивается сразу по двум направлениям. Qt6Multimedia предлагает удобный и относительно простой интерфейс для большинства прикладных задач, тогда как QtAVPlayer ориентирован на разработчиков, которым нужны расширенные функции FFmpeg и полный контроль над обработкой. Поэтому эти решения разумнее считать не прямыми конкурентами, а инструментами для разных уровней сложности.

Выбор между ними зависит от требований проекта. Для стандартного плеера, голосового приложения или программы с базовым захватом камеры подойдёт Qt6Multimedia. Если же необходимы сложные фильтры, аппаратное декодирование, управление AVFrame и AVPacket, бесшовная интеграция с собственным видеоконвейером или точная настройка поведения на разных ОС, QtAVPlayer остаётся более подходящим вариантом. Дополнительный обзор возможностей [Qt FFmpeg и QtAVPlayer](https://habr.com/ru/articles/1080420/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080420) помогает лучше понять различия между этими подходами.

Прокрутить вверх