11
votes

Comment implémenter un widget vidéo dans Qt qui s'appuie sur Gstreamer?

Je souhaite utiliser qt pour créer une application d'interface graphique simple pouvant lire un fichier vidéo local. Je pourrais utiliser Phonon qui fait tout le travail dans les coulisses, mais je dois avoir un peu plus de contrôle. J'ai déjà réussi à mettre en œuvre un pipeline Gstreamer à l'aide des éléments Decodebin et Autovideosink. Maintenant, je veux utiliser un widget Qt pour canaliser la sortie.

Quelqu'un a-t-il déjà réussi à faire cela? (Je suppose que comme il existe des lecteurs vidéo basés sur QT qui construisent sur gstreamer.) Quelqu'un peut-il me diriger dans la bonne direction sur la façon de le faire?

Remarque: Cette question est similaire à ma question postée précédente sur la manière de connecter QT avec un flux RTP entrant. Cela semblait être assez difficile. Cette question sera plus facile à répondre, je pense.

Mise à jour 1

La suggestion de Patrice d'utiliser libvlc est déjà très utile. Voici une version quelque peu plus propre du code trouvé sur le site Web de VLC: échantillon pour qt + libvlc . Cependant, ma question initiale reste: Comment puis-je connecter gstreamer à un widget Qt?

Mise à jour 2

Après une certaine expérimentation, je me suis retrouvé avec Cet exemple de travail . Cela dépend de gstwidget.h et gstwidget.cpp de ma propre petite bibliothèque Gstsupport. Toutefois, prenez note que c'est actuellement uniquement testé sur la version Mac de Qt.


2 commentaires

Hé, les liens dans update 2 sont cassés. Si possible, pouvez-vous les réparer s'il vous plaît?


Merci. BTW, pouvez-vous m'aider résoudre un problème similaire ici ?


3 Réponses :


3
votes

Version VLC est un lecteur vidéo basé sur QT (depuis la version 0.99). Il permet trop de diffuser ou de lire un flux: vous pouvez trouver toutes les informations dont vous avez besoin ici: http: //wiki.videolan .org / développeurs_corner . Vous n'avez que créer une instance du joueur et l'associer à un widget. Ensuite, vous avez le contrôle total sur le joueur.

Je l'ai déjà testé (sous Linux et Windows) en jouant des fichiers de musique et de vidéo locaux et cela fonctionne bien.

Essayez d'essayer de voir vous-même.

espère que cela aide.

edit: Il semble que vous souhaitiez utiliser VLC, vous devez écrire ou trouver (je ne sais pas si on existe un) un codec gstreamer comme expliquer sur le VideoLan Wiki . Je pense que je ferais ça.


2 commentaires

Je suis un grand fan de VLC Player, mais je ne savais pas que vous pouvez le connecter à un widget QT. Parlez-vous de libvlc ou de communiquer avec VLC à l'aide de DBU?


Je parle de libvlc. Vous avez un exemple ici: wiki.videolan.org/libvlc_samplecode_qt



7
votes

Étant donné que le phonon est basé sur gstreamer, le lieu de recherche de détails est l'arborescence source du phonon (disponible ici: http://gitorieux.org/Phonon/import/trees/master ). Pour un lecteur vidéo, vous aurez probablement besoin d'un widget d'affichage vidéo, tel que le gstreamer / videowididget.h ( CPP ) C'est à son tour utilisé le X11 Renderer ( gstreamer / x11renderer.h , CPP ). L'évier utilisé est le Xvimagesink , retombe sur le ximagesink si le premier ne peut pas être créé.

Le truc de base consiste à superposer le VideoWidIt avec la sortie vidéo. La poignée X11 nécessaire pour le faire est récupérée à l'aide du Qwidget :: Winid Méthode, qui est spécifique à la plate-forme (comme les éviers, donc pas de biggie).

En outre, si la superposition est indisponible, un qwidgetvideosink est utilisé, qui convertit les cadres vidéo en cadres individuels pour le widgetgrenderer classer. Cette classe, à son tour, rend le cadre actuel disponible en tant qu'objet QImage, prêt pour tout type de traitement.

afin de répondre à votre question - utiliser des superpositions (comme x11grenderer) ou extraire des qImages individuels du flux vidéo (comme qwidgetvideosink) . .


0 commentaires

8
votes

Pour connecter gstreamer avec votre qwidget, vous devez obtenir la poignée de la fenêtre à l'aide de qwidget :: winid () code> et vous le transmettez à gst_x_overlay_set_xwindow_id (); code> code> CODE STRUT STRT> CODE: P>

    sink = gst_element_factory_make("xvimagesink", "sink");
    gst_element_set_state(sink, GST_STATE_READY);

    QApplication::syncX();
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(sink), widget->winId());


1 commentaires

Cela ne fonctionne réellement pas pour moi. Cela fonctionne si j'appelle, qapplication :: syncx () après l'appel à Winid. Dans la version de QT récente, appeler Winid transforme automatiquement votre widget en autochtone. Voir Stackoverflow.com/questions/3573483/... pour la commande de commande