2012-08-07 3 views
1

다른 개발자가 번거롭지 않게 임베디드 장치에서 비디오를 재생할 수 있도록 QML 플러그인을 준비하려고합니다. 그러나 현재 제안 된 방식에서는 거의 항상 QML 응용 프로그램에 C++ 래퍼를 작성해야합니다. 나는이 예제를 다스 려 해요 : 내가 좋아하는 것 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/examples_2qmlplayer_2main_8cpp-example.htmlQML 및 QtGStreamer 플러그인 내

이 플러그인을 간단하게 쓸 수 있도록 :

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가이 역할을 수행합니다).

그것은 할 수 있습니다 :

QDeclarativeItem 내에서
  1. 가져 QDeclarativeView가 나중에 GraphicsVideoSurface을 공급하는 데 사용할 수있는 방법으로 (이에 내가 QML 플러그인 만 액세스 할 수 있습니다)? 내 추측은 아니지만 - QFraphicsItem :: scene() ==>QGraphScene ==> QGraphicsView의 QList - QGraphicsView의 QList - 매우 나쁜 프로그래밍처럼 보이지만 어쩌면 누군가가 그것을 얻었습니다 (나는 segfault를 얻고있다)

  2. QDeclarativeItem에서 QtGStreamer를위한 비디오 싱크를 제공하는 다른 방법이 있습니까?

Greetz

Yatsa

답변

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 요소를 사용할 수 있습니다.