【问题标题】:Gstreamer: Pausing/resuming video in RTP streamsGstreamer:暂停/恢复 RTP 流中的视频
【发布时间】:2011-01-17 10:44:55
【问题描述】:

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

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

所有内容都放入一个 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”的东西,但我认为混音器仍然需要两个流都处于活动状态。非常感谢任何反馈!

【问题讨论】:

    标签: gstreamer


    【解决方案1】:

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

    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();
    }
    

    您可能想尝试的另一个逻辑是“挂锁”。请看下面的帖子

    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-selector 和 input-selector 箱,因为它们似乎是更好的选择。我发现它们最可靠,并且非常幸运。我分别使用 fakesink 或 fakesrc 作为选择器的另一端。

    2. valve bin 是我发现甚至不需要 fakesink 或 fakesrc bin 的另一种替代方案。它也非常可靠。

    也是媒体文件源的正确状态转换顺序

    NULL -> READY -> PAUSED -> 正在播放(向上)

    正在播放 -> 暂停 -> 就绪 -> NULL(向下)

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2012-08-11
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多