2015-03-23 1 views
0

Je suis aux prises avec du code gstreamer en C, que je ne peux pas écrire. Je vous demande de me donner un exemple simple de code de syntaxe C de deux vidéos qui seront affichées dans une fenêtre en utilisant gst_child_proxy_set -> xpos, ypos. Je ne peux pas le comprendre à cause du manque d'exemples, je suis assez nouveau à Gstreamer mais vraiment besoin de le faire de cette façon. Je sais que pour certains d'entre vous c'est juste un moment pour écrire cela et j'essaye depuis quelques jours maintenant ... Cordialement!gstreamer gst_child_proxy_set C syntaxe

gst-launch-1.0 -e \ 
videomixer name=mix \ 
     sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0\ 
     sink_1::xpos=0 sink_1::ypos=0 \ 
     sink_2::xpos=640 sink_2::ypos=0 \ 
     sink_3::xpos=0 sink_3::ypos=360 \ 
     sink_4::xpos=640 sink_4::ypos=360 \ 
    ! autovideosink \ 
videotestsrc pattern="black" \ 
    ! video/x-raw,format=AYUV,width=1280,height=720 \ 
    ! mix.sink_0 \ 
uridecodebin uri=rtsp://10.0.0.121:554/video.h264 \ 
    ! videoconvert ! videoscale \ 
    ! video/x-raw,format=AYUV,width=640,height=360 \ 
    ! mix.sink_1 \ 
uridecodebin uri=rtsp://10.0.0.122:554/video.h264 \ 
    ! videoconvert ! videoscale \ 
    ! video/x-raw,format=AYUV,width=640,height=360 \ 
    ! mix.sink_2 \ 
uridecodebin uri=rtsp://10.0.0.123:554/video.h264 \ 
    ! videoconvert ! videoscale \ 
    ! video/x-raw,format=AYUV,width=640,height=360 \ 
    ! mix.sink_3 \ 
uridecodebin uri=rtsp://10.0.0.124:554/video.h264 \ 
    ! videoconvert ! videoscale \ 
    ! video/x-raw,format=AYUV,width=640,height=360 \ 
    ! mix.sink_4 \ 
+0

Vous ne trouverez peut-être pas cela utile, mais je ne pense pas que GstChildProxy soit le bon outil pour ce que vous essayez d'accomplir ici. Peut-être essayer de définir deux surfaces différentes comme puits vidéo, et mettre l'un à côté de l'autre. –

+0

Je ne sais pas comment réaliser ce que j'essaie de faire, mais j'ai créé un liner qui fonctionne bien, et maintenant j'ai besoin d'écrire même en C pour l'utiliser pour d'autres applications. Peut-être pourriez-vous m'aider à «traduire» ma ligne de commande en C? – JFCorleone

+0

Bien! Je suppose que vous faites référence à une commande 'gst-launch', n'est-ce pas? Si c'est un bon début, vous devriez le coller dans votre message. :) –

Répondre

0

D'accord, vous avez donc réussi à créer un pipeline de travail avec gst-launch. Comme vous le faites maintenant, votre pipeline Gstreamer décrit le traitement que vos données passent de leur source (votre flux RTSP) à un récepteur (un autovidéosink suivi d'un mélangeur soigné pour que vos flux soient côte à côte).

A partir de maintenant, pour l'utiliser dans un code C utile, vous avez deux options:

Donc, mon conseil serait d'utiliser quelque chose comme:

const char *pipeline_desc = "videomixer name=mix " 
    "sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0 " 
    "sink_1::xpos=0 sink_1::ypos=0 " 
    "sink_2::xpos=640 sink_2::ypos=0 " 
    /* bla bla... */ 
    "! video/x-raw,format=AYUV,width=640,height=360 " 
    "! mix.sink_4"; 


GstElement *pipeline = gst-parse-launch(pipeline_desc, NULL); 

Cette manipulation, plus un événement, et vous devriez obtenir ce que vous voulez.

Vous pouvez trouver quelques exemples de cela et bien plus dans ce très bon tutoriel: http://docs.gstreamer.com/pages/viewpage.action?pageId=327735

Ce doc m'a fait sortir de l'ennui un peu de temps. :) Bonne chance!


EDIT: il suffit que vous avez vu et ce que Authored GStreamer multiple videos in one window - C syntax vous avez essayé il construisait le même pipeline. Bien que cela doive fonctionner, cela représente une quantité de travail folle, est très sujette aux erreurs, et je dois avouer que je n'en ai jamais tiré grand-chose moi-même. : p

gst-parse-launch a été créé pour être humain comme you and me. :)

+0

Vous connaissez votre première solution mais le problème est, je dois le construire moi-même en raison d'une application supplémentaire qui sera de diffuser ces quatre vidéos en tant que flux en utilisant rtsp -server ... Je n'arrive pas à créer moi-même ce pipeline donc je cherche un exemple simple de créer seulement deux sinkpads avec des paramètres différents pour que je puisse l'utiliser pour mon code. EDIT: J'ai fait ...et apparemment, j'ai échoué: D J'utiliserais volontiers gst-parse-launch et je pourrais probablement le faire pour plusieurs vidéos, mais est-il possible de s'enfoncer dans rtsp à votre façon? – JFCorleone

+0

Je vous reçois, mais udp ne fournit pas d'adresse rtsp, il vous laisse simplement écouter sur le port spécifié. Ou peut-être puis-je lier rtsp-serveur en quelque sorte? – JFCorleone

+0

Je ai essayé de regarder dans ce domaine, mais je ne suis pas sûr. J'ai eu de l'expérience avec le côté client de la boîte à outils, pas tellement avec le côté serveur. Il y a un 'GstRTSPServer' (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-rtsp-server/html/GstRTSPServer.html) mais aucune idée de comment cela fonctionne vraiment. :( –