使用 Qt 5.0 以编程方式创建视频 [关闭]

Posted

技术标签:

【中文标题】使用 Qt 5.0 以编程方式创建视频 [关闭]【英文标题】:Create Video Programmatically with Qt 5.0 [closed] 【发布时间】:2013-01-12 01:16:45 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

从技术上讲,只要您不为使用 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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

许可页面很清楚:FFmpeg 是在 LGPL 下获得许可的,有一些 GPL 部分。如果您在没有--enable-gpl--enable-nonfree 的情况下编译 FFmpeg,那么您最终会得到一个可以在任何商业项目中使用的完整 LGPL 库。【参考方案3】:

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

【讨论】:

感谢您的详细回复。我看到这是在视频小部件中显示以编程方式生成的帧的方式,但我的问题不同。我想将视频保存到文件(.avi、.mp4 等)。你知道这是否可能吗?在我看来,Qt5 使用 QMediaRecorder 将视频保存到文件,但我不知道如何将 QVideoFrame 放入 QMediaRecorder。 糟糕,抱歉。是的,这在 Qt 中是一个更加困难的问题。浏览 Qt 5.0 文档,我真的找不到任何直接支持。我认为您最好的选择是使用 QVideoFrame 的工具来跟踪基本帧信息,然后使用第三方库写入文件。抱歉,我无法提供更多帮助! 我一直在使用qtffmpegwrapper。它不像内置的 Qt 类那么简单并且不处理音频,但它可以完成这项工作。 @Joey 非常感谢,您应该提交您的评论作为答案,因为它实际上回答了 OP 的问题。 @Matt 我发布了原始问题,我的动机是找到一种无需像 qtffmpegwrapper 这样的第三方类来保存视频的方法。这就是为什么我没有将其发布为答案。

以上是关于使用 Qt 5.0 以编程方式创建视频 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 YouTube 视频中提取音频? [关闭]

AVPlayer - 如何以编程方式打开/关闭来自 HTTP Live Streaming 视频的 CC?

以编程方式将视频转换为 FLV [关闭]

如何在android中以编程方式上传到服务器之前减小视频的大小[关闭]

如何以编程方式关闭全屏模式NSWindow?

如何使用 GStreamer 以编程方式创建视频(来自 RGB 和 PCM)?