gpt4 book ai didi

Gstreamer:在 RTP 流中暂停/恢复视频

转载 作者:行者123 更新时间:2023-12-04 17:07:07 34 4
gpt4 key购买 nike

我正在构建一个从网络源接收两个 RTP 流的 gstreamer 管道:

  1. ILBC Audio流+对应的RTCP流
  2. H263视频流+对应的RTCP流

所有内容都放入一个 gstreamer 管道中,因此它将使用来自两个流的 RTCP 来同步音频/视频。到目前为止,我已经想出了这个(使用 gst-launch 进行原型(prototype)制作):

gst-launch -vvv  gstrtpbin name=rtpbin
udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-2000" port=40000 ! rtpbin.recv_rtp_sink_0
rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink
udpsrc port=40001 ! rtpbin.recv_rtcp_sink_0
rtpbin.send_rtcp_src_0 ! udpsink port=40002 sync=false async=false

udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMU,encoding-params=(string)1,octet-align=(string)1" port=60000 rtpbin.recv_rtp_sink_1
rtpbin. ! rtppcmudepay ! autoaudiosink
udpsrc port=60001 ! rtpbin.recv_rtcp_sink_1
rtpbin.send_rtcp_src_1 ! udpsink port=60002 sync=false async=false

如果网络源以发送视频和音频开始,则此管道运行良好。如果稍后暂停视频流,gstreamer 仍会播放音频,甚至会在网络源恢复视频流时开始播放视频。

但是,我的问题是,如果网络源仅以音频流开始(稍后可能会添加视频),管道似乎会暂停/卡住,直到视频流也开始。

由于视频在我的应用程序中是可选的(并且可以由用户随意添加/删除),有什么方法可以连接,例如“videotestsrc”,它将提供某种后备视频数据以保持管道在没有网络视频数据时运行?

我尝试过使用“videotestsrc”和一个叫做“videomixer”的东西进行试验,但我认为混音器仍然需要两个流都处于事件状态。非常感谢任何反馈!

最佳答案

我展示了一个简单的函数,用于通过更改 bin 来暂停恢复。在下面的示例中,我提供了动态动态更改目标 bin 的逻辑。这不会完全停止我相信你所寻求的管道。类似的逻辑可以用于 src bins。在这里您可以删除您的网络源 bin 和相关的解码器/解复用器 bin 并添加 videotestsrc bin。

private static void dynamic_bin_replacement(Pipeline pipe, Element src_bin, Element dst_bin_new, Element dst_bin_old) {
pipe.pause();
src_bin.unlink(dst_bin_old);
pipe.remove(dst_bin_old);
pipe.add(dst_bin_new);
dst_bin_new.syncStateWithParent();
src_bin.link(dst_bin_new);
pipe.ready();
pipe.play();
}

您可能想尝试的另一个逻辑是“PADLOCKING”。请查看以下帖子

http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt

http://web.archiveorange.com/archive/v/8yxpz7FmOlGqxVYtkPb4

Adding and removing audio sources to/from GStreamer pipeline on-the-go

更新

  1. 尝试使用 output-selectorinput-selector 容器,因为它们似乎是更好的选择。我发现他们是最可靠的,并且与他们相处得非常好。我分别使用 fakesinkfakesrc 作为选择器的另一端。

  2. valve bin 是另一种选择,我发现它甚至不需要 fakesinkfakesrc bin。它也非常可靠。

还有媒体文件源的正确状态转换顺序

NULL -> READY -> PAUSED -> PLAYING(向上)

PLAYING -> PAUSED -> READY -> NULL(向下)

我在上面的例子中的顺序应该更正,ready() 应该在 pause() 之前。此外,我倾向于认为取消链接应该在 null() 状态之后而不是在 pause() 之后执行。我没有尝试过这些更改,但理论上它们应该有效。

查看以下链接了解详细信息

http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-states.txt?h=BRANCH-RELEASE-0_10_19

关于Gstreamer:在 RTP 流中暂停/恢复视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4712266/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com