1

我正在尝试准备 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 提供视频接收器?

格雷茨

八字

4

1 回答 1

0

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

但是,一种想法是通过子类 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 元素而不引用导出的视频表面上下文项。

于 2012-08-08T15:25:30.177 回答