C++ 动态替换正在播放的gstreamer管道中的元素

C++ 动态替换正在播放的gstreamer管道中的元素,c++,c,linux,c++11,gstreamer,C++,C,Linux,C++11,Gstreamer,我正在寻找正确的技术,如果存在的话,用于动态替换正在运行的gstreamer管道中的元素。我有一个基于gStudier-C++的应用程序,它创建的流水线看起来像这样(使用GST启动语法): souphttpsrc位置=”http://localhost/local.ts" ! mpegtsdemux name=d!队列mpeg2dec!xvid!队列A52秒!脉冲墨水 在播放过程中(即GST_STATE_PLAYING是管道状态,用户正在愉快地观看视频),我需要从管道中删除souphttpsrc

我正在寻找正确的技术,如果存在的话,用于动态替换正在运行的gstreamer管道中的元素。我有一个基于gStudier-C++的应用程序,它创建的流水线看起来像这样(使用GST启动语法):

souphttpsrc位置=”http://localhost/local.ts" ! mpegtsdemux name=d!队列mpeg2dec!xvid!队列A52秒!脉冲墨水

在播放过程中(即GST_STATE_PLAYING是管道状态,用户正在愉快地观看视频),我需要从管道中删除souphttpsrc并创建一个新的souphttpsrc,甚至一个新的neonhttpssource,然后立即将其添加回管道,并在执行此操作之前播放的同一时间位置继续播放同一uri源流。用户可能会看到一个小的延迟,这很好

我们还没有弄清楚如何删除和替换源代码,我们需要更多的理解。以下是我们迄今为止最好的尝试:

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);
这并不完美,因为源从一开始就在播放,而管道的其余部分正在等待正确的时间戳缓冲区(我假设),因为几秒钟后,播放会恢复。我试着用多种方法寻找源头,但没有任何效果

我需要知道做这件事的正确方法。如果我们想要动态地替换解码器或其他元素,那么最好知道一种通用技术(如果存在的话)


谢谢

我想这可能就是你想要的:


(从第115行开始)

如果内存不是很紧,可以创建一个输入选择器,然后更改选择器。您可以稍后创建httpsource并将其添加到输入选择器中,然后根据需要进行切换。更简单的机制。我也想知道为什么要重新创建源元素?如果我知道原因,也许我们可以建议一个更好的方法?那里什么都没有,你有其他链接吗?@user230137试试谷歌
gstreamer part block.txt
。我得到的第一件事是: