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() 方法,我无法获得正确的帧...

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

4

1 回答 1

1

视频通常使用硬件加速进行解码和渲染,因此要求像这样绘制小部件可能根本不起作用,或者至少它取决于实际的视频播放器后端。

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

如果您想要视频和 GUI 的屏幕截图而不实际显示窗口,我不知道该怎么做。

于 2015-05-25T17:32:54.567 回答