Подтвердить что ты не робот

Создание видео с помощью Qt 5.0

У нас есть приложение QT, которое отображает программно созданные QPixmaps один за другим на дисплей, и мы хотели бы сохранить этот вывод в видеофайл. Я знаю, что в прошлом люди рекомендовали использовать ffmpeg или opencv с Qt для этого. В Qt 5, однако, новый модуль QtMultimedia, похоже, раскрывает некоторые из этих функций. Теперь можно, например, сохранить видео с источника камеры в Qt 5 с помощью QMediaRecorder, как описано в http://qt-project.org/doc/qt-5.0/qtmultimedia/qmediarecorder.html#details. С помощью этой новой функциональности есть ли способ использовать Qt 5 для сохранения нашего программно сгенерированного видео, или мне еще лучше использовать стороннюю библиотеку?

4b9b3361

Ответ 1

Это действительно возможно уже в Qt 4.7 с помощью QVideoFrame и QAbstractVideoSurface. Qt даже имеет этот отличный пример для создания виджета видео, который может отображать программно построенные QVideoFrames:

http://qt-project.org/doc/qt-4.8/multimedia-videowidget.html

Вы можете объединить этот виджет с возможностями QVideoFrame для сопоставления отдельных видеокадров с правильно отформатированными данными. Это должно выглядеть примерно так:

Создайте свой видеоролик:

VideoWidgetSurface * videoWidget = new VideoWidgetSurface();
QSize videoSize(500,500); // supplement with your video dimensions

// look at VideoWidgetSurface::supportedPixelFormats for supported formats
QVideoSurfaceFormat format( videoSize, QVideoFrame::Format_RGB32, QAbstractVideoBuffer::QPixmapHandle)

// possibly fill with initial frame?

videoWidget->start(format);

... и если вы хотите обновить текущий кадр виджета видео:

// If you don't need the data in any past frames you can probably just create one frame
// and just use it repeadtly (as VideoWidgetSurface only keeps track of one frame at a time)
QVideoFrame aFrame(32 * format.frameWidth()  * format.frameHeight(),format.frameSize(), 32 * format.frameWidth(),format.pixelFormat());

aFrame.map(QAbstractVideoBuffer::WriteOnly);

QRgb * pixels = aFrame.bits();

// perform pixel manipulation here...

aFrame.unmap();

videoWidget->present(aFrame);

.. и завершить воспроизведение...

videoWidget.stop();

Ответ 2

[... Три года спустя]. Как выяснено выше, вопрос заключается в создании видеофайлов (например,.avi,.mpeg, анимированных .gif и/или .mp4).

Похоже, что FFmpeg НЕ является вариантом для коммерческих приложений. См. например: https://www.ffmpeg.org/legal.html (предложение "Заметьте, что FFmpeg..." и два последних абзаца на странице).

На самом деле Qt по-прежнему не имеет встроенной возможности генерации видеофайлов (например,.avi,.mpeg, анимированных .gif и/или .mp4). См. обновление ниже.

Я прав? (при этом Qt 5.5.1 является последней доступной версией Qt в данный момент).

ИЛИ А ТАКЖЕ какие-либо лицензируемые (за плату) пакеты, которые можно использовать с приложением Windows Qt/С++, которое может создавать видеофайлы? (из последовательности программно генерируемых QPixmaps или QImages - или, по крайней мере, с возможностью получения данных изображения кадра из этих Qt-классов?).

(В настоящее время мы не нуждаемся в аудио в видеофайлах, созданных в нашем приложении Qt).

UPDATE: К сожалению, поддержка коммерческих лицензий Qt подтверждает, что в настоящее время (с Qt 5.6) нет способа получить последовательность программно сгенерированных QImages (например, рендер из приложения QWidget) в класс QMediaRecorder - или любым другим способом генерации синтетических анимаций и сохранения их в виде видеофайлов. ( "Для этого нет API" ).

Ответ 3

Возможно, вы захотите проверить библиотеку libqtavi: http://soft.proindependent.com/qtavi

Он позволяет приложениям на основе Qt легко сохранять видеофайлы в формате контейнера AVI и доступен под двумя лицензиями: open-source (GPL v. 3.0) и коммерческий.

Ответ 4

Технически, до тех пор, пока вы не платите за возможности, которые вы используете для FFmpeg, и вы используете отдельный исполняемый файл для FFmpeg, вы следуете за лицензиями LGPL и GPL. Независимо от того, хотите ли вы рискнуть стать объектом судебного разбирательства, это другая тема.

У меня такая же потребность (в коммерческих целях), и я не могу предложить вам решение, отличное от использования FFmpeg в качестве исполняемого файла, который разрешен в соответствии с этими лицензиями.

Изменить: Этот поток может быть вам полезен: https://softwareengineering.stackexchange.com/info/205689/using-exe-of-program-with-gnu-general-public-license-version-2-0-for-commercial