使用GStreamer打包现有的h264流并将其通过网络发送到VLC

时间:2019-07-15 08:58:44

标签: raspberry-pi gstreamer vlc rtp

我正在尝试使用 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播放吗?

1 个答案:

答案 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通信。