使用 Qt 5.0 以编程方式创建视频



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

我知道过去人们建议使用ffmpeg或opencv和Qt来做到这一点。 然而,在Qt 5中,新的QtMultimedia模块似乎暴露了一些这种类型的功能。

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

有了这个新功能,有没有办法使用Qt 5来保存我们以编程方式生成的视频,或者我是否仍然最好使用第三方库?

这实际上早在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();

[...三年后]。如上所述,问题是关于生成视频文件(例如.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应用程序一起使用?(来自一系列以编程方式生成的QPixmaps或QImages——或者至少有可能从这些Qt类接收帧图像数据?)。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新