我们有一个QT应用程序,它以编程方式生成的QPixmaps逐个呈现给显示器,我们希望将此输出保存到视频文件中。
我知道过去人们建议在Qt中使用ffmpeg或opencv来执行此操作。然而,在Qt 5中,新的QtMultimedia模块似乎暴露了一些此类功能。
现在可以使用http://doc.qt.io/qt-5/qmediarecorder.html#details中所述的QMediaRecorder,在Qt 5中保存来自相机源的视频。
有了这个新功能,有没有办法使用Qt 5保存我们以编程方式生成的视频,或者我最好还是使用第三方库?
答案 0 :(得分:5)
这实际上可以在Qt 4.7中通过使用QVideoFrame和QAbstractVideoSurface来实现。 Qt甚至有一个很好的例子来创建一个可以显示以编程方式构建的QVideoFrames的Video Widget:
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();
答案 1 :(得分:1)
[......三年后]。如上所述,问题是关于生成视频文件(例如.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和#34;)。
答案 2 :(得分:0)
从技术上讲,只要您没有为使用FFmpeg的功能收费,并且为FFmpeg使用单独的可执行文件,您就会遵循LGPL和GPL许可。您是否愿意冒险成为诉讼的目标是一个不同的主题。
我有同样的需求(商业上)并且除了使用FFmpeg作为可调用的可执行文件之外,不能为您提供解决方案,这是在这些许可下允许的。