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