动态替换播放gstreamer管道中的元素

时间:2012-08-24 17:36:12

标签: c++ c linux c++11 gstreamer

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

souphttpsrc location =“http://localhost/local.ts”! mpegtsdemux name = d!排队! mpeg2dec! xvimagesink d。 !排队! a52dec! pulsesink

在播放过程中(即GST_STATE_PLAYING是管道状态,用户正在欣赏视频),我需要从管道中删除souphttpsrc并创建一个新的souphttpsrc,甚至是一个新的neonhttpsource,然后立即添加回来进入管道并在我们执行此操作之前在播放所在的同一时间位置继续播放相同的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);

这不能很好地工作,因为源从头开始播放,而管道的其余部分正在等待正确的时间戳缓冲区(我假设),因为几秒钟后,回放会重新启动。我试图以多种方式寻找源头,但没有任何效果。

我需要知道这样做的正确方法。如果我们想要动态替换解码器或其他元素,那么了解一般技术(如果存在的话)会很好。

感谢

1 个答案:

答案 0 :(得分:1)

我认为这可能是您正在寻找的: http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt

(从第115行开始)