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



我正试图使用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负载器,它将对生成的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

当使用零延迟时,您可能会获得更好的结果:

像这个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

相关内容

  • 没有找到相关文章

最新更新