我正在尝试使用 raspivid 和 gstreamer cli通过网络从Raspberry PI摄像机流式传输。我希望能够在客户端上使用VLC“开放网络流”查看流。
这与问题GStreamer rtp stream to vlc有关,但是我的问题并不完全相同。我的想法不是对我的PI摄像机的原始输出进行编码,而是利用现有的 raspivid 的 h264 输出,将其混合到适当的容器中,然后通过TCP或UDP。
我能够使用以下管道成功地将 raspivid 的h264输出捕获到mp4文件中(具有正确的fps和长度信息):
raspivid -n -w 1280 -h 720 -fps 24 -b 4500000 -a 12 -t 30000 -o - | \
gst-launch-1.0 -v fdsrc ! video/x-h264, width=1280, height=720, framerate=24/1 ! \
h264parse ! mp4mux ! filesink location="videofile.mp4"
但是,当我尝试通过网络流式传输时:
raspivid -n -w 1280 -h 720 -fps 24 -b 4500000 -a 12 -t 0 -o - | \
gst-launch-1.0 -v fdsrc ! video/x-h264, width=1280, height=720, framerate=24/1 ! \
h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.168.1.20 port=5000
...并尝试在VLC上使用rtp://192.168.1.20:5000
打开流,它会报告错误。
编辑:好的,我误以为udpsink监听传入的连接。但是,在更改了管道的最后一部分以使用我客户的IP地址! udpsink host=192.168.1.77 port=5000
并尝试在VLC上使用udp://@:5000
打开该地址之后,播放器没有显示任何内容(PI和接收计算机都是在同一局域网上,我可以看到客户端上的传入网络流量。
有人知道如何正确构建 gstreamer 管道,以在网络上传输现有的h264流,该流可以由客户端上的香草VLC播放吗?
答案 0 :(得分:2)
假定这是由于缺少SPS / PPS数据引起的。例如。如果先启动VLC,然后再启动Raspberry PI上的视频管道,则可能会起作用。默认情况下,SPS / PPS标头很可能在流的开头仅发送一次。
如果接收器错过了SPS / PPS标头,它将无法解码H.264流。我猜这可以通过使用config-interval=-1
的{{1}}属性来解决。
使用该选项,应在每隔几秒钟发生一次的每个IDR帧之前发送SPS / PPS数据-取决于编码器。
另一件事是,您不需要使用h264parse
块。仅通过UDP直接发送MPEG TS就足够了。
话虽如此,管道应如下所示:
rtpmp2tpay
raspivid -n -w 1280 -h 720 -fps 24 -b 4500000 -a 12 -t 0 -o - | \
gst-launch-1.0 -v fdsrc ! \
video/x-h264, width=1280, height=720, framerate=24/1 ! \
h264parse config-interval=-1 ! mpegtsmux ! udpsink host=192.168.1.77 port=5000
是在192.168.1.77
上运行VLC的客户端的IP地址。另外,请确保没有防火墙阻止向客户端(特别是Windows防火墙)的传入UDP通信。