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

时间:2011-01-17 10:44:56

标签: gstreamer

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

  1. ILBC音频流+相应的RTCP流
  2. H263视频流+相应的RTCP流
  3. 所有内容都放在一个gstreamer管道中,因此它将使用两个流中的RTCP来同步音频/视频。到目前为止,我已经提出了这个问题(使用gst-launch进行原型设计):

    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'的东西,但我认为混音器仍然要求两个流都活着。非常感谢任何反馈!

1 个答案:

答案 0 :(得分:1)

我通过更改垃圾箱来提供暂停恢复的简单功能。在下面的示例中,我提供了动态更改目标bin的逻辑。这不应该完全阻止你所相信的管道。类似的逻辑可以用于src箱。在这里,您可以删除网络源bin和相关的解码器/解复用器箱,并添加videotestsrc箱。

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. 尝试输出选择器输入选择器容器,因为它们似乎是更好的选择。我发现它们最可靠,并且对它们有很大的好运。我分别使用 fakesink fakesrc 作为选择器的另一端。

  2. valve bin是我发现甚至不需要 fakesink fakesrc 垃圾箱的另一种选择。它也非常可靠。

  3. 媒体文件源的正确状态转换顺序

    NULL - >准备 - >暂停 - >播放(向上)

    播放 - >暂停 - >准备 - > NULL(向下)

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

    有关详细信息,请参阅以下链接

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