Мне нужно воспроизвести пользовательский файл AVI, содержащий классический видеопоток, аудиопоток , а также пользовательский поток данных.
Пользовательский поток содержит данные, которые визуализируются с помощью некоторых пользовательских виджетов; эти виджеты нуждаются только в том, чтобы каждый пользовательский кадр записывался в буфер в нужное время.
Наше приложение основано на Qt и уже использует QMediaPlayer
/QVideoWidget
для воспроизведения традиционных видео, но дополнительный пользовательский поток усложняет работу, потому что AFAIK QMediaPlayer
воспроизводит только видео/аудио и игнорирует все остальное.
Я бы хотел избежать повторного использования всего qt-multimedia
, но я не уверен, как сделать все возможное из доступных классов Qt.
Мои идеи до сих пор:
-
Создайте собственный медиаплеер, который демультиплексирует и декодирует видео с помощью
ffmpeg
, реализует синхронизацию, используетQAudioOutput
для воспроизведения звука, создает потокQVideoFrame
для воспроизведения на видео и записи пользовательских данных в некоторый буфер для визуализации.Проблема. Чтобы избежать написания кода для масштабирования/преобразования видеокадров, я хотел бы повторно использовать
QVideoWidget
, но, похоже, работает только с "реальным"QMediaPlayer
. -
Demux входной файл и канал
QMediaPlayer
с AV-потоками. Demux введитеffmpeg
(возможно, оставив декодирование в бэкенд Qt), попроситеQIODevice
извлечь только видео/аудиопотоки из входного файла, а другой - для получения потока данных. Воспроизведите видео/аудио с помощьюQMediaPlayer
.+-------+ | QFile | +---^---+ | inherits | +--------------------+ | MyAviDemuxer | | | | holds a queue of | | demuxed packets | +--------------------+ | | readDataPacket readVideoPacket | | +-------v--------+ +--------v-----------+ +-----------+ | MyCustomReader | | MyVideoAudioStream +--inherits--> QIODevice | +----------------+ +--------+-----------+ +-----------+ | setMedia | +-------v-------+ | QMediaPlayer | +---------------+
Проблема: синхронизировать синхронизацию потока данных с
QMediaPlayer
, обработать заголовки и метаданные правильно.
Я немного склонен к варианту 1, только потому, что он дает мне больше контроля, но мне интересно, пропустил ли я более простое решение (даже для Windows).