将带有QGraphicsVideoItem的QGraphicsScene渲染为QImage

4

这部分问题已经解决

我想要将带有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窗口(Qt3D)中渲染视频。然而,QGraphicsView和QGLView似乎不能同时呈现。如果我不使用QGLView的show()方法,我可以获取视频帧。如果我使用QGLView的show()方法,我无法获得正确的帧...

那么,我该如何实现上述想法?


谢谢你的建议:) - Krasus Chai
如果您有新的问题,请提出新的问题。在问题得到回答后更改问题是应该避免的。当然,如果新问题是旧问题的直接延续,您可以参考旧问题。 - hyde
1个回答

1
视频通常使用硬件加速进行解码和渲染,因此要求小部件像这样绘制可能根本行不通,或者至少取决于实际的视频播放器后端。
您可以使用QScreen::grabWindow(假设是Qt 5,Qt 4中为QPixmap::grabWindow),在屏幕实际呈现后。要实际拥有任何视频,您需要在视频实际显示时抓取屏幕截图,因此您必须在事件循环正在运行且窗口实际显示时执行它,例如通过覆盖showEvent或仅使用QTimer
如果您想要窗口的视频和GUI的屏幕截图而不实际显示窗口,我不确定该怎么做。

我使用这个程序来测试我的项目中的一个问题,即我想在QGLView中显示视频。我将QGraphicsView的信号changed连接到QGLView的插槽上,以将视频的帧作为纹理设置到表面上。 我没有意识到可能会不同步。我稍后会再试一下。谢谢~ - Krasus Chai
我成功保存了视频的图像!谢谢。 - Krasus Chai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接