16

我们有一个 QT 应用程序,它将以编程方式生成的 QPixmap 一张一张地呈现到显示器上,我们希望将此输出保存到视频文件中。

我知道过去人们建议使用 ffmpeg 或 opencv 和 Qt 来执行此操作。然而,在 Qt 5 中,新的 QtMultimedia 模块似乎公开了一些此类功能。

例如,现在可以使用http://doc.qt.io/qt-5/qmediarecorder.html#details中描述的 QMediaRecorder 在 Qt 5 中保存来自相机源的视频。

有了这个新功能,有什么方法可以使用 Qt 5 来​​保存我们以编程方式生成的视频,还是使用第三方库更好?

4

3 回答 3

5

这实际上早在 Qt 4.7 就可以通过使用 QVideoFrame 和 QAbstractVideoSurface 来实现。Qt 甚至有这个很好的例子来创建一个可以显示编程构造的 QVideoFrames 的视频小部件:

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

您可以将此小部件与 QVideoFrame 的映射功能结合使用,以使用格式正确的数据填充单个视频帧。这应该看起来像这样:

实例化你的 videoWidget:

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();
于 2013-03-01T09:22:01.760 回答
2

[... 三年后]。如上所述,问题是关于生成视频文件(例如 .avi、.mpeg、动画 .gif 和/或 .mp4)。

看起来FFmpeg真的不是商业应用程序的选择——例如参见:https ://www.ffmpeg.org/legal.html (“注意 FFmpeg ...”句子和页面上的最后两段)。

看起来 Qt 仍然没有生成视频文件的本机功能(例如 .avi、.mpeg、动画 .gif 和/或 .mp4)——请参阅下面的更新。

我说得对吗?(此时 Qt 5.5.1 是最新的可用 Qt 版本)。

或者是否有任何可许可(收费)的软件包可以与可以创建视频文件的 Qt/C++ Windows 应用程序一起使用?(来自一系列以编程方式生成的 QPixmap 或 QImage ——或者至少有可能从那些 Qt 类接收帧图像数据?)。

(我们目前不需要从我们的 Qt 应用程序生成的视频文件中的任何音频)。

更新:不幸的是,Qt 商业许可证支持人员正在确认,目前(从 Qt 5.6 开始),没有办法将一系列以编程方式生成的 QImage(例如,从应用程序 QWidget 渲染)到 QMediaRecorder 类或任何其他类中生成合成动画并将其保存为视频文件的方法。(“没有相应的 API”)。

于 2016-01-22T18:35:18.120 回答
0

从技术上讲,只要您不为使用 FFmpeg 的功能收费,并且为 FFmpeg 使用单独的可执行文件,您就遵循 LGPL 和 GPL 许可证。您是否愿意冒成为诉讼目标的风险是另一个话题。

我有同样的需求(商业上),除了使用 FFmpeg 作为可调用的可执行文件之外,我无法为您提供解决方案,这在这些许可证下是允许的。

编辑:此线程可能对您有用:https ://softwareengineering.stackexchange.com/questions/205689/using-exe-of-program-with-gnu-general-public-license-version-2-0-for-商业的

于 2016-03-28T23:46:08.550 回答