我知道如何接受来自网络摄像头的流并将其显示在摇摆组件中:
args = Gst.init("VideoTest", args);
pipe = new Pipeline("VideoTest");
final Element videosrc = ElementFactory.make("v4l2src", "source");
final Element videofilter = ElementFactory.make("capsfilter", "filter");
videofilter.setCaps(Caps.fromString("video/x-raw-yuv, width=640, height=480"
+ ", bpp=32, depth=32, framerate=30/1"));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
VideoComponent videoComponent = new VideoComponent();
Element videosink = videoComponent.getElement();
pipe.addMany(videosrc, videofilter, videosink);
Element.linkMany(videosrc, videofilter, videosink);
// Now create a JFrame to display the video output
JFrame frame = new JFrame("Swing Video Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(videoComponent, BorderLayout.CENTER);
videoComponent.setPreferredSize(new Dimension(720, 576));
frame.pack();
frame.setVisible(true);
// Start the pipeline processing
pipe.setState(State.PLAYING);
}
});
我现在要做的是为每个客户端提供此流,该客户端将使用例如vlc媒体播放器或其他视频流阅读器连接到某个端口。这必须是通用的,也就是说我可能想要连接另一个gstreamer程序并使该程序成为中继服务器:它是第一个客户端,并使该流可用于其他客户端。
有办法做到这一点吗?我还是gstreamer的新手......
答案 0 :(得分:1)
使用RTPbin实际上非常简单,但首先你需要对视频进行编码,因为发送原始YUV会占用大量带宽。
以下是使用h263编码和RTP bin的示例管道:
gst-launch-1.0 rtpbin name=rtpbin \
v4l2src ! videoconvert ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink port=5000 \
rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false \
udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \
此处提供更多信息(包括如何在另一端接收此数据): http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtpbin.html