GStreamer-Java:RTSP-Source到UDP-Sink

时间:2014-06-14 12:18:23

标签: java gstreamer pipeline

我目前正在开展一个项目,以便在视频通话中将RTP-Stream从IP网络摄像头转发(后来转码)为SIP用户。

我提出了以下gstreamer管道:

  gst-launch -v rtspsrc location="rtsp://user:pw@ip:554/axis-media/media.amp?videocodec=h264" ! rtph264depay ! rtph264pay ! udpsink sync=false host=xxx.xxx.xx.xx port=xxxx

它非常好用。现在我想用java创建这个管道。这是我创建管道的代码:

    Pipeline pipe = new Pipeline("IPCamStream");

    // Source
    Element source = ElementFactory.make("rtspsrc", "source");
    source.set("location", ipcam);

    //Elements
    Element rtpdepay = ElementFactory.make("rtph264depay", "rtpdepay");
    Element rtppay = ElementFactory.make("rtph264pay", "rtppay");

    //Sink
    Element udpsink = ElementFactory.make("udpsink", "udpsink");
    udpsink.set("sync", "false");
    udpsink.set("host", sinkurl);
    udpsink.set("port", sinkport);


    //Connect
    pipe.addMany(source, rtpdepay, rtppay, udpsink);
    Element.linkMany(source, rtpdepay, rtppay, udpsink);


    return pipe;

当我启动/设置管道时,我能够使用wireshark查看摄像机的输入,但遗憾的是没有发送到UDP-Sink。我已经检查过几次错误的代码,我甚至设置了一个从文件(filesrc)流到同一个udpsink的流水线,它也可以正常工作。

但是为什么IP-Cam的“转发”到UDP-Sink不能使用这个Java-Pipeline?

1 个答案:

答案 0 :(得分:3)

我还没有使用Java版本的GStreamer,但是在链接时需要注意的是有时元素的源垫不能立即使用。

如果您执行 gst-inspect rtspsrc ,并查看打击垫,您会看到:

Pad Templates: 
  SRC template: 'stream_%u'
    Availability: Sometimes
    Capabilities:
      application/x-rtp
      application/x-rdt

那"可用性:有时"表示您的初始链接将失败。只有在到达一定数量的RTP数据包后才能显示所需的源填充。

对于这种情况,你需要通过等待 pad-added 事件手动链接元素,或者我喜欢在C中使用 gst_parse_bin_from_description 函数。 Java中可能有类似的东西。它会自动为添加了pad的事件添加侦听器并链接管道。

gst-launch使用这些相同的parse_bin函数,我相信。这就是为什么它总能将事情联系起来。