2012-08-16 115 views
1

我试图通过使用GStreamer的UDP流式传输v4l2src。 发送部分(显然)确定,但接收部分丢失了一些东西。GStreamer UDP发送/接收一行

这些都是实际的线路:

发送: gst-launch-0.10 -v gstrtpbin name=rtpbin v4l2src device=/dev/video0 ! 'video/x-raw-yuv, width=(int)320, height=(int)240, framerate=(fraction)15/1' ! rtpvrawpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! multiudpsink clients="127.0.0.1:9996" rtpbin.send_rtcp_src_0 ! multiudpsink clients="127.0.0.1:9997" sync=false async=false udpsrc port=10000 ! rtpbin.recv_rtcp_sink_0

接收: gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YUV, depth=(string)8, width=(string)320, height=(string)120, colorimetry=(string)SMPTE240M" port=9996 ! rtpbin.recv_rtp_sink_0 rtpbin. ! rtpvrawdepay ! video/x-raw-yuv,framerate=15/1 ! xvimagesink udpsrc port=9997 ! rtpbin.recv_rtcp_sink_0 rtpbin.send_rtcp_src_0 ! multiudpsink clients="127.0.0.1:10000" sync=false async=false

我缺少什么?

问候

编辑:

有些帽不见了,所以我说他们现在的接收器不会崩溃,但只是空转,而不显示任何内容。

发送: gst-launch-0.10 -v gstrtpbin name=rtpbin v4l2src device=/dev/video0 ! 'video/x-raw-yuv, width=(int)320, height=(int)240, framerate=(fraction)15/1' ! rtpvrawpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! multiudpsink clients="127.0.0.1:9996" rtpbin.send_rtcp_src_0 ! multiudpsink clients="127.0.0.1:9997" sync=false async=false udpsrc port=10000 ! rtpbin.recv_rtcp_sink_0

接收: gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:0, depth=(string)8, width=(string)320, height=(string)240, colorimetry=(string)SMPTE240M, ssrc=(uint)956768427, payload=(int)96, clock-base=(uint)1415613946, seqnum-base=(uint)35008" port=9996 ! rtpbin.recv_rtp_sink_0 rtpbin. ! rtpvrawdepay ! video/x-raw-yuv,framerate=15/1 ! xvimagesink udpsrc port=9997 ! rtpbin.recv_rtcp_sink_0 rtpbin.send_rtcp_src_0 ! multiudpsink clients="127.0.0.1:10000" sync=false async=false

回答

5

您所做的错误是,我们假定你是你的v4l2src会发出。如果你想要一个特定的帧速率的高度和宽度,你需要使用videoscale和videorate过滤器

gst-launch-0.10 -v gstrtpbin name=rtpbin v4l2src device=/dev/video0 ! videorate ! videoscale ! ffmpegcolorspace ! 'video/x-raw-yuv, width=(int)320, height=(int)240, framerate=(fraction)15/1' ! rtpvrawpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! multiudpsink clients="127.0.0.1:9996" rtpbin.send_rtcp_src_0 ! multiudpsink clients="127.0.0.1:9997" sync=false async=false udpsrc port=10000 ! rtpbin.recv_rtcp_sink_0 

现在,这将打印您需要在reciever端使用的瓶盖。例如。对我来说这印。 (字符串)视频,时钟速率=(整数)90000,编码名称=(字符串)原始编码(字符串)原始编码名称=(字符串)原始编号(字符串)YCbCr-4:4:4,depth =(string)8,width =(string)320,height =(string)240,colorimetry =(string)SMPTE240M,ssrc =(uint)1825678493,payload =(INT)96,时钟基=(UINT)4068866987,SEQNUM基=(UINT)24582

在reciever管道使用此:

GST_DEBUG=2 gst-launch udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:4:4, depth=(string)8, width=(string)320, height=(string)240, colorimetry=(string)SMPTE240M, ssrc=(uint)1825678493, payload=(int)96, clock-base=(uint)4068866987, seqnum-base=(uint)24582" port=9996 ! queue ! rtpvrawdepay ! queue ! ffmpegcolorspace ! autovideosink 

这里所述的接收器无法知道的方式确切的大写,因此必须从发送方复制粘贴。如果您想要使用不同的采样方式,请在发件人上使用ffmpegcolorspace,并在其后面设置适当的大写字母。 (旁边的宽度,高度和帧率)

上述管道对我来说工作正常。请记住,每次运行src时,ssrc和其他一些参数都会有所不同。

+0

完全按照我的意愿工作!谢谢。 <...> PS:难以添加音频吗? – alexandernst 2012-08-21 18:11:06

+0

不是。同样的原则适用。我建议你先创建一个单独的音频专用管道。然后结合这两者。 – av501 2012-08-22 05:03:07