2016-09-16 4 views
2

Ich versuche ein Gsrtreamer Video in einer QT App mit QML zu integrieren.Wie wird eine Gstreamer Senke in ein QML VideoItem eingebunden?

Ich habe mit dem Beispiel qmlplayer2 begonnen, die ein entferntes Video verwendet:

player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi")); 

ich dieses Beispiel geändert hat eine Pipeline zu verwenden, um eine udpsrc zu bekommen:

m_pipeline = QGst::Pipeline::create(); 
    QGst::ElementPtr udp = QGst::ElementFactory::make(QLatin1Literal("udpsrc")); 
    udp->setProperty("address", "192.168.1.1"); 
    udp->setProperty("port", 3333); 
    QGst::ElementPtr decodage = QGst::ElementFactory::make("jpegdec"); 
    QGst::ElementPtr videosink = QGst::ElementFactory::make("autovideosink"); 

Welches equivaltent ist zu:

Das funktioniert, ich bekomme mein Video gestreamt und mein Spiel/Pause/st Op-Tasten arbeiten.

aber das Video ist in einem anderen Fenster Two separate windows

Während meiner QML ist die Angabe, dass VideoItem im Hauptfenster ist:

Rectangle { 
    id: window 
    width: 600 
    height: 300 
    Column { 
     width: 600 
     height: 544 
     y : 10; 
     VideoItem { 
      id: video 
      y : 10; 
      width: window.width 
      height: 260 
      surface: videoSurface1 //bound on the context from main() 
     } 
     // Other buttons 

Jedes Thema, das ich gefunden ist entweder zu alt (gstreamer stammt in Qt seit 5.5 dieses Jahr) oder hat keine Antworten

Gibt es einen Fehler in meiner Arbeit?

Gibt es eine andere Möglichkeit zu tun, was ich will?

Danke.

Antwort

2

Das Problem hier ist autovideosink implementiert "GstVideoOverlay" nicht. In Ihrer Pipeline sollten Sie als "sink" -Element eines dieser Elemente "xvimagesink, xximagesink" verwenden oder "playbin" direkt verwenden, dieses Element implementiert die "GstVideoOverlay" -Schnittstelle.

Hier ein Beispiel mit "playbin". Beachten Sie, dass in diesem Beispiel reiner Gstreamer ohne QT-Wrapper verwendet wird.

GstElement *pipeline = gst_element_factory_make("playbin", "playbin"); 
/* Set the URI to play */ 
g_object_set(pipeline, "uri", url, NULL); 
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), windowsID); 

* WindowsID ist die Widget-ID, wo Sie Ihre Videoausgabe zeichnen möchten. * URL ist Ihre Video-URL. Für Sie wäre "udp: //192.168.1.1: 3333"

Verwandte Themen