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 は videoSurface プロパティを VideoItem に提供する必要があります。これを行う唯一の方法は、rootContext() で追加のプロパティのコンテキストを作成して設定することです。GraphicsVideoSurface を作成するには、QGraphicsView が必要です (QDeclarativeView がこの役割を果たします)。

次のことは可能ですか。

  1. QDeclarativeItem 内から QDeclarativeView を取得し (QML プラグインからのみアクセスできます)、後で GraphicsVideoSurface をフィードするために使用できるようにしますか? 私の推測ではありません-しかし、パス QFraphicsItem::scene() ==> QGraphScene ==> QGraphScene::views() ==> QList of QGraphicsView を見つけました-非常に悪いプログラミングのように見えますが、誰かがそれを機能させたのかもしれません(私はセグメンテーション違反を起こしています)

  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 に答える