2017-02-27 2 views
0

J'ai lu la plupart de la documentation sur Gstreamer et comment l'utiliser, mais il y a très peu d'explications sur la combinaison de Gstreamer et d'autres threads liés à gstreamer non . Donc, j'essaie de créer une application simple où, sur un thread, j'ai un pipeline simple avec un élément source connecté directement à un élément de dissipation. J'utilise la bibliothèque "pthread" pour gérer les threads. Ensuite, je crée un autre pthread pour gérer les autres parties du programme. Pour ce faire, j'utilise cet exemple (http://www.thegeekstuff.com/2012/04/create-threads-in-linux/?utm_source=feedburner).Utilisation de Gstreamer avec pthreads

Voici le programme:

#include<gst/gst.h> 

#include<stdio.h> 
#include<string.h> 
#include<pthread.h> 
#include<stdlib.h> 
#include<unistd.h> 

pthread_t tid[2]; 

void* doSomeThing(void *arg) 
{ 
    GMainLoop *loop; 

    printf("\n Completed. \n"); 

    GstElement *pipeline; 

    loop = g_main_loop_new (NULL, FALSE); 

    pipeline = gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL); 

    gst_element_set_state (pipeline, GST_STATE_PLAYING); 

    g_main_loop_run (loop); 

    gst_element_set_state (pipeline, GST_STATE_NULL); 

    gst_object_unref (GST_OBJECT (pipeline)); 

    g_main_loop_unref (loop); 

    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    gst_init (&argc, &argv); 

    pthread_create(&(tid[0]), NULL, &doSomeThing, NULL); 

    return 0; 
} 

Je Compile. Pas d'erreurs Quand je l'exécute, il n'ouvre aucune fenêtre et ne démarre pas le streaming ou quoi que ce soit. J'ai l'impression que c'est comme ça que je crée mon thread pipeline. Donc, en bout de ligne, je n'ai pas une bonne connaissance de Gstreamer et toute aide est très appréciée.

(Notez que dans le code précédent, j'omis la création du second fil puisque le problème est que le pipeline n'est pas en streaming.)

+1

Je n'ai pas un seul iota d'expérience avec pthreads ou gstreamer, ou comment les threads fonctionnent sur les boîtes Unix, mais je ferai remarquer que votre application fonctionne directement à travers cette méthode principale et se termine. Je parierai que les pthreads sont des threads d'arrière-plan et sont détruits dès que le thread principal se termine. Vous devez bloquer cette méthode principale et attendre que tout soit terminé. – Will

+0

Il n'y a pas non plus de raison d'avoir un thread supplémentaire pour votre pipeline GStreamer. GStreamer génère ses propres threads en interne et son API n'est pas bloquante pour la plupart. –

+0

@Florian Zwoch .. Oui, j'ai essayé d'exécuter le pipeline sur le même thread, mais il ne continue pas à partir de là. Donc, autant que je sache, c'est bloquant. Je vois que je ne reçois aucune réponse alors soit ma question est vraiment stupide et pour la première fois personne ne connaît la réponse. Au moins quelqu'un peut-il me diriger vers une bonne documentation sur la combinaison de Gstreamer avec d'autres threads non-Gstreamer? – user3521388

Répondre

0

g_main_loop_run() est une boucle d'événement GLib: il y a une boucle à l'intérieur (envoyer un signal d'abandon quand vous voulez le terminer). C'est tout, n'importe quoi d'autre n'est pas pertinent à l'interaction de fil.

n'est pas exact:

gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL);

devrait probablement être:

gst_parse_launch ("v4l2src ! xvimagesink", NULL); 

Set variable d'environnement GST_DEBUG à un certain niveau. Ajoutez des vérifications et des gestionnaires d'erreur au code (comme écouter sur le bus du pipeline et imprimer des erreurs ou vérifier que gst_parse_launch(...) != NULL et que l'état est vraiment changé pour "jouer").

+0

Oui, la première chose que vous avez mentionnée n'était pas le problème puisque gst-parse-launch analyse la commande en ligne de commande et "v4l2src! Xvimagesink" ne fonctionne pas. Qu'est-ce que l'astuce était de mettre un sommeil (5) ou d'arrêter le programme de se terminer dans la fonction main(), donc grâce à Will qui a commenté et aidé. Ce que Florian Wzoch a dit est faux cependant. J'ai essayé de faire quelque chose après avoir réglé le pipeline pour jouer et il ne l'a pas fait. Il pourrait donc y avoir des façons de créer et de diffuser des pipelines de façon non bloquante, mais la façon dont je le faisais bloquait définitivement le processus. – user3521388

+0

Si son blocage signifie que le pipeline n'est pas pré-roulant. Cela signifie que quelque chose d'autre ne fonctionne pas avec votre pipeline. Si le pipeline passe correctement son état à la lecture, il continuera l'exécution du programme. –