使用NodeJS中继RTP流

时间:2017-10-06 02:23:45

标签: javascript node.js raspberry-pi gstreamer

我尝试使用NodeJS将Raspberry Pi中的RTP数据包中继到我的Macbook Air。

以下是我用来在我的Raspberry Pi上创建视频Feed的gstreamer命令:

gst-launch-1.0 rpicamsrc bitrate=1000000 \
    ! 'video/x-h264,width=640,height=480' \
    ! h264parse \
    ! queue \
    ! rtph264pay config-interval=1 pt=96 \
    ! gdppay \
    ! udpsink host=10.0.0.157 port=3333

然后我通过NodeJS从我的Mac上的Raspberry Pi收到数据报,并使用以下代码将它们转发到我的Mac上的端口5000:

var udp = require('dgram');
var server = udp.createSocket('udp4');

server.on('message',function(msg,info){
    server.send(msg,5000,'0.0.0.0', function(){

    });
});

server.bind(3333);

这是我在我的Mac上运行的gstreamer命令,用于在我的Mac上的端口5000上接收RTP数据报流:

gst-launch-1.0 udpsrc port=5000 \
    ! gdpdepay \
    ! rtph264depay \
    ! avdec_h264 \
    ! videoconvert \
    ! osxvideosink sync=false

直接从Raspberry Pi到端口5000上的gstreamer流可以正常工作,但是,当我尝试使用NodeJS应用程序作为转发数据包的中介时,我从Mac上的gstreamer收到以下错误:

ERROR: from element /GstPipeline:pipeline0/GstGDPDepay:gdpdepay0: Could not decode stream.
Additional debug info:
gstgdpdepay.c(490): gst_gdp_depay_chain (): /GstPipeline:pipeline0/GstGDPDepay:gdpdepay0:
Received a buffer without first receiving caps

有没有办法让NodeJS作为中介将RTP数据包转发给gstreamer客户端?

1 个答案:

答案 0 :(得分:2)

通过改变我启动服务器/ RTP流的顺序,我能够通过NodeJS成功地从Raspberry Pi中继RTP流。

Gstreamer抛出了错误Received a buffer without first receiving caps,因为我在启动NodeSJ UDP中继服务器之前启动了Raspberry Pi视频流。 Gstreamer使用称为“Caps Negotation”的过程来确定“optimal solution for the complete pipeline”。此过程发生在客户端播放流之前。在NodeJS中继服务器之前启动Raspberry Pi流时,gstreamer客户端错过了上限协商过程,并且不知道如何处理数据缓冲区。

进行此设置功能的操作顺序如下:

(1)在客户端计算机上启动gstreamer:

gst-launch-1.0 udpsrc port=5000 \
    ! gdpdepay \
    ! rtph264depay \
    ! avdec_h264 \
    ! videoconvert \
    ! osxvideosink sync=false

(2)在客户端计算机上启动NodeJS中继服务器:

var udp = require('dgram');
var server = udp.createSocket('udp4');

server.on('message',function(msg,info){
    server.send(msg,5000,'0.0.0.0', function(){

    });
});

(3)在Raspberry Pi上启动视频流

gst-launch-1.0 rpicamsrc bitrate=1000000 \
    ! 'video/x-h264,width=640,height=480' \
    ! h264parse \
    ! queue \
    ! rtph264pay config-interval=1 pt=96 \
    ! gdppay \
    ! udpsink host=[CLIENT_MACHINE_IP_HERE] port=3333