用QGraphicsVideoItem渲染QGraphicsScene到QImage



这部分已经解决

我想渲染QGraphicsScene与QGraphicsVideoItem到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窗口(Qt3D)中渲染视频。然而,QGraphicsView和QGLView似乎不能同时渲染。如果我不使用QGLView的show()方法,我可以得到视频帧。如果我使用QGLView的show()方法,我无法得到正确的帧…

那么我怎样才能实现上面的想法呢?

视频通常是使用HW加速解码和渲染的,所以要求widget像这样被绘制可能根本不起作用,或者至少它取决于实际的视频播放器后端。

你可以使用QScreen::grabWindow(假设Qt 5,它是QPixmap::grabWindow在Qt 4),在屏幕实际渲染后。要实际拥有任何视频,您需要在视频实际显示时抓取屏幕显示,因此您必须在事件循环运行并且窗口实际显示时执行此操作,例如通过覆盖showEvent或仅使用QTimer

如果你想要视频和GUI的截图,而不实际显示窗口,我不知道如何去做。

相关内容

  • 没有找到相关文章

最新更新