2015-05-25 6 views
4

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

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

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

Итак, как я мог реализовать идею выше?

+0

thx для вашего совета:) –

+0

Если у вас есть новый вопрос, задайте новый вопрос. Меняя вопрос после ответа, можно избежать. Вы можете обратиться к своему старому вопросу, если новый квест является прямым продолжением его, конечно. – hyde

ответ

1

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

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

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

+0

Я использую эту программу для проверки проблемы в моем проекте, в которой я хочу показать видео в QGLView. Я подключаю сигнал QGraphicsView, измененный слотом QGLView, чтобы установить кадр видео как текстуру на поверхность. Я не понял, что это может быть несинхронизировано. Я попробую позже спасибо ~ –

+0

Мне удалось сохранить iamges видео! Спасибо. –