插件中的QML和QtGStreamer



我正在尝试准备QML插件,以便在嵌入式设备上播放视频,其他开发人员可以轻松使用它。然而,目前提出的方式几乎总是需要围绕你的QML应用程序编写一些C++包装器。我指的是这个例子:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/examples_2qmlplayer_2main_8cpp-example.html

我希望能够拥有插件并简单地编写:

import AwesomeVideoPlugin 1.0
Rect
{
    AwesomeVideo
    {
        width: 320 
        height: 240
        url: "./myvideo.avi" 
        // ... some minor stuff like mouse click handling, controls, etc.
    }
}

目前,QtGStreamer需要向VideoItem提供videoSurface属性。执行此操作的唯一方法是在 rootContext() 中为其他属性创建和设置上下文。要创建GraphicsVideoSurface,我需要QGraphicsView(QDeclarativeView填补了这个角色)。

是否可以:

  1. 从QDeclarativeItem(我只能从QML插件访问)中获取QDeclarativeView,以便以后可用于馈送GraphicsVideoSurface?我的猜测是否定的 - 但是我找到了路径 QFraphicsItem::scene() ==> QGraphScene ==> QGraphScene::views() ==> QGraphicsView 的 QList - 它看起来像非常糟糕的编程,但也许有人让它工作(我得到了段错误)

  2. 有没有其他方法可以从QDeclarativeItem中为QtGStreamer提供视频接收器?

格莱兹

亚察

我有同样的问题,但还没有想出一个优雅的解决方案。

但是,一种想法是通过子类化 QApplication 对象的访问器函数使视频表面可用。

当然,这意味着您的插件依赖于具有getVideoSurface方法的应用程序子类,但它确实消除了QML代码中的丑陋之处。

class MyApp : public QApplication
{
    ....
     QGst::Ui::GraphicsVideoSurface *getVideoSurface() { return m_videosurface; }
}
 ...
int MyApp::init()
{
     m_viewer = new QDeclarativeView(); 
     m_viewer->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
     m_videosurface = new QGst::Ui::GraphicsVideoSurface(m_viewer);
}
MyVideoPlugin::MyVideoPlugin(QDeclarativeItem *parent) : QDeclarativeItem(parent)
{
    QGst::Ui::GraphicsVideoSurface *surface = ((MyApp*)qApp)->getVideoSurface();
}
...

现在,可以使用 MyVideoPlugin 元素,而无需引用导出的视频表面上下文项。

相关内容

  • 没有找到相关文章

最新更新