Zum implementieren eines video-widget von Qt, das baut auf GStreamer?
Will ich mit Qt zu erstellen eine einfache GUI-Anwendung, die dazu beitragen können, lokale video-Datei. Ich verwenden könnte, Phonon, das macht die ganze Arbeit hinter den kulissen, aber ich brauche, um ein wenig mehr Kontrolle. Ich habe bereits erfolgreich die Implementierung einer GStreamer-pipeline mit der decodebin und autovideosink Elemente. Jetzt will ich mit einem Qt-widget-Kanal der Ausgabe zu.
Hat jemand schon einmal gelungen, dies zu tun? (Ich nehme an, da gibt es Qt-basierten video-Playern bauen Sie auf GStreamer.) Kann mir jemand zeigen in die richtige Richtung auf, wie es zu tun?
Hinweis: Diese Frage ist ähnlich zu meinem vorherigen geposteten Frage auf, wie die Verbindung von Qt mit einer eingehenden RTP-stream. Das schien ziemlich schwierig. Diese Frage wird leichter zu beantworten, denke ich.
Update 1
Patrice ' s Vorschlag, libVLC ist sehr hilfreich bereits. Hier ist eine etwas sauberere version des Kodex finden Sie auf der VLC-website:
Beispiel für Qt + libVLC.
Aber meine ursprüngliche Frage bleibt: Wie Verbinde ich GStreamer auf ein Qt-widget?
Update 2
Nach einigen Experimenten landete ich mit in diesem Beispiel arbeiten. Es hängt davon ab, GstWidget.h und GstWidget.cpp aus meiner eigenen kleinen GstSupport Bibliothek. Jedoch, beachten Sie, dass ist derzeit nur getestet auf die Mac-version von Qt.
- Hey, die links in
Update 2
gebrochen sind. Wenn möglich, können Sie Sie zu beheben, bitte? - Fixiert Sie.
- Danke. BTW, kannst du mir helfen die Lösung eines ähnlichen Problems hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verbinden Gstreamer mit Ihrem QWidget zu erhalten, müssen Sie das Fenster-handle mit
QWidget::winId()
und übergeben Sie es angst_x_overlay_set_xwindow_id();
Grobe Beispielcode:
Auch, Sie wollen, dass Ihre widgets werden unterstützt durch einen native-Fenster wird erreicht, indem die
Qt::AA_NativeWindows
- Attribut der Ebene der Anwendung oder derQt::WA_NativeWindow
Attribut auf der widget-Ebene.Seit Phonon basiert auf gstreamer, der Platz für details ist der Phonon-source-Baum (hier: http://gitorious.org/phonon/import/trees/master). Für einen video-Spieler sind, sind Sie wahrscheinlich gehen zu müssen, ein video-display-widget, wie die gstreamer/videowidget.h ( cpp ), die wiederum verwendet die X11-renderer (gstreamer/x11renderer.h, cpp). Die Spüle verwendet wird, ist die xvimagesink, fällt zurück auf die ximagesink, wenn der erste nicht erstellt werden kann.
Der grundlegende trick ist, um die overlay-VideoWidget mit dem video-Ausgang. Die X11-handle benötigt zu tun, dies ist wieder mit der QWidget::winId - Methode, die an eine bestimmte Plattform gebunden ist (wie das Waschbecken, also nicht schlimm).
Auch, wenn overlay nicht verfügbar ist, ein QWidgetVideoSink verwendet wird, wandelt der video-frames in einzelne frames für die WidgetRenderer Klasse. Diese Klasse wiederum macht den aktuellen frame zur Verfügung als ein QImage-Objekt, bereit für jede Art der Verarbeitung.
Also um deine Frage zu beantworten - entweder overlays (wie X11Renderer) oder extrahieren einzelner QImages aus dem video-stream (wie QWidgetVideoSink).
VLC-version ist eine QT-basierte video-player (seit der version 0.99). Es erlaubt zu streamen oder zu Lesen stream: finden Sie alle Informationen, die Sie brauchen, hier: http://wiki.videolan.org/Developers_Corner. Sie nur haben, erstellen Sie eine Instanz des players an und verbinden Sie diese zu einem widget. Dann haben Sie die volle Kontrolle über die Spieler.
Habe ich bereits getestet (unter Linux und Windows) spielen lokale Musik-und video-Dateien, und es funktioniert gut.
Geben Sie ihm einen Versuch und sehen Sie selbst.
Hoffe, das hilft.
Edit:
Es scheint, wenn Sie möchten, verwenden Sie VLC, die Sie benötigen, zu schreiben oder zu finden (ich weiß nicht, ob vorhanden) ein GStreamer-codec, wie erklären Sie auf der videolan wiki. Ich glaube, ich würde das tun.