如上代码所示,我们在SDP消息体中提供了两种流传输方式,分别是TCP和UDP,通过Invite请求所带的 “rtpovertcp ”参数来控制,TCP方式因为其不丢包的传输方式在GB28181设备推流到公网服务器的方案中得以广泛应用,然而,目前市面上的多数支持国标的设备都不支持tcp模式推流,udp仍然是主流的推流方式,不过,经测试udp推流方式在公网应用中效果比较差,需要进一步优化或者改进。
3 接入服务器接收ACK应答并Invite请求设备开始推流
回调函数中ack应答处理js代码如下:
uas.once(
\'ack\', async ctx => {
const request = ctx.request;
const callId = request.headers[
\'call-id\'];
if (request.content.length >
0 )
{
const serial = serialDevice;
//sip.parseUri(request.headers.from.uri).user;
let response ;
if(!
this.session_.has(callId))
{
response = await
this.inviteDevice(serial, code, callId, request.content);
//Invite Device is complete
if(response !=
undefined)
{
if(response.content)
{
const transform =
require(
\'sdp\');
const res = transform.parse(response.content);
console.log(res.media[
0].protocol);
if((res.media[
0].protocol ===
\'RTP/AVP\'&&
parseInt(rtpovertcp)===
0) ||
(res.media[
0].protocol ===
\'TCP/RTP/AVP\'&&
parseInt(rtpovertcp)===
1) ){
if (response.status ===
200 )
{
//send ack to stream server
this.ackMediaServer(response.status,request,request.content);
this.session_.set(callId, response);
}
}
else{
response.status =
700;
}
}
console.log(
\'inviteMediaServer ack is coming.......response=\'+
JSON.stringify(response));
}
resolve(response);
}
else{
console.log(
\'inviteMediaServer this.session_.has: \'+callId);
}
}
});
如上代码所示,在InviteDevice请求完成后,我们在返回Response处理过程中做过一次特殊处理,即:如果TCP拉流时发现设备拉流应答中返回其推流模式依然是’RTP/AVP’的UDP模式,我们认为其设备不支持TCP模式,从而向上层返回700,不支持的流媒体传输方式。
4 Invite设备正常返回200应答并传递给流媒体服务器
代码在第3点中有所体现。
5 流媒体服务接受拉流请求成功应答
uas.on(
\'ack\',
async ctx => {
const request = ctx.request;
if (request.content.length ===
0) {
return;
}
const serial = sip.parseUri(request.headers.
from.uri).user;
this.session_.
set(serial, request);
const ssrc = serialTossrc(serial);
// resole a new stram,and refresh to redis
const info = JSON.parse(
await redis.
get(`stream:${parseInt(ssrc)}`));
this.registerStream(parseInt(ssrc),info.uuId,
false);
});
至此,整个拉流过程已经完成,这时,不出意外的话设备端将会通过我们指定的传输方式将流推送到我们指定的UDP/TCP服务器上,并转发到我们指定的EasyDSS流媒体服务器。
获取更多信息
邮件:support@easydarwin.org
WEB:
流媒体技术交流QQ群:538316953
Copyright © EasyDarwin.org 2012-2018