Qml视频创建来自C ++的图像流

时间:2016-03-25 07:10:14

标签: c++ image video-streaming qml qt5

经过10天的努力,我回到了对我的任务提出一个基本问题。

我有三层结构。

T1。一个名为' MPC'它发布了一个主题' video_image'连续帧(例如每秒30帧视频图像)。

T2。 C ++程序是作为Qt5.5项目开发的 - 一种中间工作者。

T3。 Qml UI上的图像类型对象(Qt5.5 Quick)。

我想在MPA(T1)的帧中显示T3 UI上的视频片段。 到目前为止,我可以肯定的是从T1中创建QImages,我可以在PWD上创建临时图像文件(例如,currentFrame.jpg)。

我应该怎样做才能将帧流作为UI视频播放器的源(即到目前为止,我仍然认为图像类型是视频播放器UI候选者。)

我是否正在寻找解决方案?从这些图片帧流创建视频查看器源的可行方法是什么?

1 个答案:

答案 0 :(得分:1)

这可以通过使用QQuickPaintedItem完成。

在C ++ Qt部分,你需要有一个继承QQuickPaintedItem的类:

// imagewriter.h

class imagewriter : public QQuickPaintedItem
{
    Q_OBJECT

public:
    imagewriter(QQuickItem *parent = 0);

    void paint(QPainter *painter);
    //the paint method is already implemented in QQuickPaintedItem
    //you just override it

    QImage image; //your image

};

// imagewriter.cpp

imagewriter::imagewriter(QQuickItem *parent): QQuickPaintedItem(parent)
{

}

void imagewriter::paint(QPainter *painter)
{
    painter->drawImage(QPoint(0,0),this->image);
    //this will simply draw the image in your qml UI !
}

现在您只需要注册此对象,以便能够在qml文件中使用它:

//在主.cpp:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<imagewriter>("mr.jb",1,0,"my_video_image");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

// main.qml:

import mr.jb 1.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


my_video_image {
            id : my_img_strm1
            anchors.centerin : parent
        }
}

my_video_image对象应该能够显示你的qimage,你需要做的就是不断将这个图像更新到你从ROS流中获得的最后一个图像,每次你调用预定义的更新时( ); 方法,以便自动重新触发paint方法,该方法负责在qml世界中绘制图像。 我想你没有T1部分的问题。

在T2(C ++类)中接收和构建映像可以通过多种方式完成(例如,QUdp)。

最后一部分(T3)在上面的代码中描述。