【发布时间】:2012-08-20 07:10:19
【问题描述】:
我正在寻找正确的技术(如果存在),用于动态替换正在运行的 gstreamer 管道中的元素。我有一个基于 gstreamer 的 c++ 应用程序,它创建的管道看起来像这样(使用 gst-launch 语法):
souphttpsrc location="http://localhost/local.ts" ! mpegtsdemux 名称=d !队列 ! mpeg2dec ! xvimagesink d. !队列 ! a52dec !脉冲接收器
在播放过程中(即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);
这并不完美,因为源正在从头开始播放,而管道的其余部分正在等待正确的时间戳缓冲区(我假设),因为几秒钟后,播放又恢复了。我尝试通过多种方式寻找来源,但没有任何效果。
我需要知道执行此操作的正确方法。如果我们想要动态替换解码器或其他元素,如果也存在一种通用技术,那将是很好的。
谢谢
【问题讨论】:
-
如果您的内存不是太紧,您可以创建一个输入选择器,然后更改选择器。您可以稍后创建 httpsource 将其添加到输入选择器,然后在需要时切换。更简单的机制。我也很想知道为什么要重新创建源元素?如果我知道原因,也许我们可以提出更好的方法?
标签: c++ c linux c++11 gstreamer