2 votes

remplacement dynamique d'éléments dans un pipeline gstreamer en cours de lecture

Je cherche la bonne technique, si elle existe, pour remplacer dynamiquement un élément dans un pipeline gstreamer en cours d'exécution. J'ai une application c++ basée sur gstreamer et le pipeline qu'elle crée ressemble à ceci (en utilisant la syntaxe gst-launch) :

souphttpsrc location="http://localhost/local.ts" ! mpegtsdemux name=d ! queue ! mpeg2dec ! xvimagesink d. ! queue ! a52dec ! pulsesink

Au milieu de la lecture (c'est-à-dire que GST_STATE_PLAYING est l'état du pipeline et que l'utilisateur regarde tranquillement la vidéo), je dois supprimer souphttpsrc du pipeline et créer un nouveau souphttpsrc, ou même un nouveau neonhttpsource, puis le réintroduire immédiatement dans le pipeline et continuer la lecture du même flux uri source à la même position temporelle que celle où se trouvait la lecture avant que nous n'effectuions cette opération. L'utilisateur peut constater un léger retard, ce qui n'est pas grave.

Nous avons à peine compris comment retirer et remplacer la source, et nous avons besoin de plus de compréhension. Voici notre meilleure tentative jusqu'à présent :

gst_element_unlink(source, demuxer);
gst_element_set_state(source, GST_STATE_NULL);
gst_bin_remove(GST_BIN(pipeline), source);
source = gst_element_factory_make("souphttpsrc", "src");
g_object_set(G_OBJECT(source), "location", url, NULL);
gst_bin_add(GST_BIN(pipeline), source);
gst_element_link(source, demuxer);
gst_element_sync_state_with_parent(source);

Cela ne fonctionne pas parfaitement car la source est lue depuis le début et le reste du pipeline attend les tampons horodatés corrects (je suppose) car après plusieurs secondes, la lecture reprend. J'ai essayé de rechercher la source de plusieurs façons, mais rien n'a fonctionné.

J'ai besoin de savoir quelle est la bonne façon de procéder. Il serait bon de connaître une technique générale, s'il en existe une, au cas où nous voudrions remplacer dynamiquement le décodeur ou un autre élément.

merci

1voto

Jan Spurny Points 3159

Je pense que c'est ce que vous recherchez : http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt

(à partir de la ligne 115)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X