Udp GStreamer-从树莓到VLC-PC的网络摄像头流

Udp GStreamer-从树莓到VLC-PC的网络摄像头流,udp,gstreamer,vlc,webcam-capture,Udp,Gstreamer,Vlc,Webcam Capture,我正在尝试使用gstreamer 1.0将网络摄像头视频从树莓流到VLC播放器。 现在,我得到了关于覆盆子的以下命令: gst-launch-1.0 -vv -e v4l2src device=/dev/video0 \ ! videoscale \ ! "video/x-raw,width=352,height=288,framerate=10/1" \ ! queue \ ! x264enc \ ! h264parse \ ! rtph264pay config-interval=10

我正在尝试使用gstreamer 1.0将网络摄像头视频从树莓流到VLC播放器。 现在,我得到了关于覆盆子的以下命令:

gst-launch-1.0 -vv -e v4l2src device=/dev/video0  \
! videoscale \
! "video/x-raw,width=352,height=288,framerate=10/1" \
! queue  \
! x264enc \
! h264parse \
! rtph264pay config-interval=10 pt=96 \
! udpsink host=239.255.12.42 port=5004
以及以下sdp文件,以使用vlc播放流:

c=IN IP4 239.255.12.42
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
当我运行gst-launch-1.0命令时,我可以通过wireshark看到它正在发送udp数据包,但当我尝试使用vlc和sdp文件播放流时,我什么也得不到。vlc日志显示:

es error: cannot peek
es error: cannot peek
live555 error: no data received in 10s, aborting
我不知道怎么了。我可能没有正确地构建管道,这就是为什么vlc不能将该流识别为正确的视频流。有什么想法吗


提前感谢您的帮助。

VLC了解ts流与RTP协议的结合。该方法是在mpegtsmux之后使用rtp payloader,它将对生成的ts缓冲区(数据包)进行有效负载

因此,与此相反:

src ! queue ! x264enc ! h264parse ! rtph264pay ! udpsink
您可以这样做:

src ! queue ! x264enc ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink
然后在vlc中只使用
rtp://@:port
通过这种方式,mpegtsmux将封装有关

我应该注意的是,您的方法没有错误,,而且可能更有效(mpegtsmux将视频分割成188字节的数据包,但您的方法将分割成约1400字节的udp数据包),但您需要为vlc提供正确的SDP文件,以便对其进行流式传输。 例如,我喜欢,但我对此没有太多经验

因此,这是您当前使用的管道:

gst-launch-1.0 -vv -e v4l2src device=/dev/video0 ! "video/x-raw,width=352,height=288,framerate=25/1"\ ! queue ! x264enc speed-preset=1 ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.255.10.41 port=5004
使用zerolatency可能会获得更好的结果:

像这样
x264enc tune=4
它将丢弃所有其他质量参数,如速度预设等

这是关于tune属性的文档:

tune : Preset name for non-psychovisual tuning options
       flags: readable, writable
       Flags "GstX264EncTune" Default: 0x00000000, "(none)"
       (0x00000001): stillimage       - Still image
       (0x00000002): fastdecode       - Fast decode
       (0x00000004): zerolatency      - Zero latency

单播对你有用吗?试试
host=127.0.0.1
谢谢你的回复@otopolsky。我试过了,是的,现在它显示了一些图像。。。但是速度太慢了。vlc日志显示
主要错误:ES_OUT_SET_(GROUP_)PCR调用太晚(pts_延迟增加到567 ms)主要错误:ES_OUT_RESET_PCR调用avcodec错误:超过5秒的延迟视频->丢弃帧(计算机太慢?
。也许对覆盆子来说太多了。我正试图找到一个编码器,它不需要太多的树莓马力。到目前为止,运气不好。在x264enc上设置更快的预设值怎么样?请尝试
speed preset=2
,或者您甚至可以尝试
tune=zerolatency
Hi@otopolsky!我试过了,结果是一样的。。。vlc日志显示:
es错误:无法查看es错误:无法查看主要错误:无法调整显示avcodec错误:延迟视频超过5秒->删除帧(计算机太慢?).avcodec错误:延迟视频超过5秒->删除帧(计算机太慢?
。我必须继续搜索:)。谢谢你的回复!当您仅在vlc
rtp://:5004
中使用时会发生什么?您也可以尝试不使用缩放,这可能对rpi来说太多了。。当你这样做的时候,CPU的负载是多少?很好的解释!现在我更好地理解mpegtsmux切片部分!尽管重复,但还是要感谢@otopolsky!我有一个非常类似的管道(mpegtsmux!rtpmp2tpay!udpsink),但是我的VLC不播放流。你能详细说明一下如何设置VLC来播放这个吗?谢谢