使用 QGraphicsVideoItem 渲染 QGraphicsScene 到 QImage
Rendering a QGraphicsScene with QGraphicsVideoItem to QImage
这部分已经解决
我想将带有 QGraphicsVideoItem 的 QGraphicsScene 渲染到 QImage。当 QGraphicsScene 仅与 QGraphicsTextItem 一起使用时,一切正常。但是,如果我用 QGraphicsVideoItem 替换 QGraphicsTextItem,它无法获得正确的图像输出。
如何解决这个问题?谢谢...
下面的代码就是为了测试这个问题。
#include <QApplication>
#include <QGraphicsScene>
#include <QMediaPlayer>
#include <QGraphicsVideoItem>
#include <QImage>
#include <QGraphicsView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
/* part 1. videoItem */
QMediaPlayer* videoPlayer = new QMediaPlayer;
QGraphicsVideoItem* screen = new QGraphicsVideoItem;
videoPlayer->setVideoOutput(screen);
scene.addItem(screen);
videoPlayer->setMedia(QUrl::fromLocalFile("./data/Taylor Swift - Blank Space.mp4"));
videoPlayer->play();
videoPlayer->setVolume(100);
/* part 2. textItem */
/*QGraphicsScene scene;
QGraphicsTextItem* text = new QGraphicsTextItem("aaaaaaa");
scene.addItem(text);*/
QGraphicsView view(&scene);
view.resize(1920, 1080);
view.show();
videoPlayer->pause();
QImage image(1920, 1080, QImage::Format_ARGB32);
image.fill(Qt::blue);
QString pngName = "scene.png";
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
image.save(pngName);
return a.exec();
}
在您的 .pro 文件中添加以下内容可能会有所帮助:)
QT += core gui
QT += core
#QT += 3d
QT += gui
QT += multimedia
QT += widgets
QT += multimediawidgets
新问题
在我的项目中,我想在 QGLView Window(Qt3D) 中渲染视频。但是,QGraphicsView 和QGLView 好像不能同时渲染。如果我不使用QGLView的show()方法,我可以得到视频帧。如果我使用 QGLView 的 show() 方法,我无法获得正确的帧...
那么如何实现上面的想法呢?
视频通常使用硬件加速进行解码和渲染,因此要求像这样绘制小部件可能根本不起作用,或者至少取决于实际的视频播放器后端。
您可以在 Qt 4) 中使用 QScreen::grabWindow
(assuming Qt 5, it was QPixmap::grabWindow
,在实际渲染屏幕之后。要真正拥有任何视频,您需要在视频实际显示时抓取屏幕显示,因此您必须在事件循环为 运行 并且实际显示 window 后执行此操作,例如通过覆盖 showEvent
或仅使用 QTimer
.
如果您想要视频和 GUI 的屏幕截图而不实际显示 window,我不确定该怎么做。
这部分已经解决
我想将带有 QGraphicsVideoItem 的 QGraphicsScene 渲染到 QImage。当 QGraphicsScene 仅与 QGraphicsTextItem 一起使用时,一切正常。但是,如果我用 QGraphicsVideoItem 替换 QGraphicsTextItem,它无法获得正确的图像输出。 如何解决这个问题?谢谢... 下面的代码就是为了测试这个问题。
#include <QApplication>
#include <QGraphicsScene>
#include <QMediaPlayer>
#include <QGraphicsVideoItem>
#include <QImage>
#include <QGraphicsView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
/* part 1. videoItem */
QMediaPlayer* videoPlayer = new QMediaPlayer;
QGraphicsVideoItem* screen = new QGraphicsVideoItem;
videoPlayer->setVideoOutput(screen);
scene.addItem(screen);
videoPlayer->setMedia(QUrl::fromLocalFile("./data/Taylor Swift - Blank Space.mp4"));
videoPlayer->play();
videoPlayer->setVolume(100);
/* part 2. textItem */
/*QGraphicsScene scene;
QGraphicsTextItem* text = new QGraphicsTextItem("aaaaaaa");
scene.addItem(text);*/
QGraphicsView view(&scene);
view.resize(1920, 1080);
view.show();
videoPlayer->pause();
QImage image(1920, 1080, QImage::Format_ARGB32);
image.fill(Qt::blue);
QString pngName = "scene.png";
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
image.save(pngName);
return a.exec();
}
在您的 .pro 文件中添加以下内容可能会有所帮助:)
QT += core gui
QT += core
#QT += 3d
QT += gui
QT += multimedia
QT += widgets
QT += multimediawidgets
新问题
在我的项目中,我想在 QGLView Window(Qt3D) 中渲染视频。但是,QGraphicsView 和QGLView 好像不能同时渲染。如果我不使用QGLView的show()方法,我可以得到视频帧。如果我使用 QGLView 的 show() 方法,我无法获得正确的帧...
那么如何实现上面的想法呢?
视频通常使用硬件加速进行解码和渲染,因此要求像这样绘制小部件可能根本不起作用,或者至少取决于实际的视频播放器后端。
您可以在 Qt 4) 中使用 QScreen::grabWindow
(assuming Qt 5, it was QPixmap::grabWindow
,在实际渲染屏幕之后。要真正拥有任何视频,您需要在视频实际显示时抓取屏幕显示,因此您必须在事件循环为 运行 并且实际显示 window 后执行此操作,例如通过覆盖 showEvent
或仅使用 QTimer
.
如果您想要视频和 GUI 的屏幕截图而不实际显示 window,我不确定该怎么做。