我目前正在开展一个项目,以便在视频通话中将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?
答案 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函数,我相信。这就是为什么它总能将事情联系起来。