2

我正在尝试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

4

1 回答 1

6

你犯的错误是你假设你的 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

现在,这将打印您需要在接收端使用的上限。例如。对我来说,这是打印出来的。/GstPipeline:pipeline0/GstRtpBin:rtpbin.GstGhostPad:send_rtp_src_0.GstProxyPad:proxypad2: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW,采样=(字符串)YCbCr-4:4:4,深度=(字符串)8,宽度=(字符串)320,高度=(字符串)240,色度=(字符串)SMPTE240M,ssrc=(uint)1825678493,有效载荷= (int)96,时钟基数=(uint)4068866987,seqnum-base=(uint)24582

在接收器管道上使用它:

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 和其他一些参数都会有所不同。

于 2012-08-20T10:24:42.123 回答