繁体   English   中英

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

[英]dynamically replacing elements in a playing gstreamer pipeline

我正在寻找用于动态替换正在运行的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);

这并不完美,因为源从头开始播放,而管道的其余部分正在等待正确的带时间戳的缓冲区(我认为),因为在几秒钟后,播放会恢复。 我试图以多种方式寻找来源,但没有任何效果。

我需要知道正确的方法。 如果我们想动态替换解码器或其他元素,也很高兴知道一种通用技术(如果存在)。

谢谢

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

(从第115行开始)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM