Визуализация QGraphicsScene с QGraphicsVideoItem в QImage

Эта часть решена

Я хочу отрендерить QGraphicsScene с QGraphicsVideoItem в QImage. Все работает, когда QGraphicsScene только с QGraphicsTextItem. Однако, если я заменю QGraphicsTextItem на QGraphicsVideoItem, он не сможет получить правильный вывод изображения. Как это исправить? Спасибо... следующие коды для проверки этой проблемы.

#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, кажется, не могут быть отображены одновременно. Если я не использую метод show() QGLView, я могу получить видеокадры. Если я использую метод show() QGLView, я не могу получить правильные кадры...

Так, как я мог понять идею выше?

1 ответ

Решение

Видео обычно декодируется и воспроизводится с использованием ускорения HW, поэтому запрос на рисование виджета таким образом может не сработать вообще или, по крайней мере, зависит от фактического бэкэнда видеопроигрывателя.

Вы могли бы использовать QScreen::grabWindow (при условии, что Qt 5 было QPixmap::grabWindow в Qt 4), после того как экран фактически отображается. Чтобы на самом деле было любое видео, вам нужно сделать снимок экрана, когда видео действительно показывается, поэтому вы должны сделать это, когда цикл событий запущен и окно фактически отображается, например, путем переопределения showEvent или просто используя QTimer,

Если вы хотите сделать скриншот как видео, так и графического интерфейса без фактического отображения окна, я не уверен, как это сделать.

Другие вопросы по тегам