要求
- 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发,目标设备的实时视音频流宜通过本域的媒体服务器进行转发;
- 采用INVITE方法实现会话连接,采用RTP/RTCP协议实现媒体传输;
- 信令流程分为客户端主动发起和第三方呼叫控制两种方式,本文主要介绍客户端主动发起的方式;
- 应具有媒体流保活机制;
流程
- 客户端主动发起
流程分析:
- 媒体流接收者向SIP服务器发送INVITE消息,消息头域中携带Subject字段,包括视频源ID、发送方媒体流序列号、媒体流接收者ID、接收端媒体流序列号标识等参数,SDP消息体中s字段为"Play"代表实时点播;
- SIP服务器收到INVITE请求,通过三方呼叫控制建立媒体服务器和媒体流发送者之间的媒体连接。向媒体服务器发送INVITE消息,此消息不携带SDP消息体;
- 媒体服务器收到SIP服务器的INVITE请求,回复200 OK,携带SDP消息体,消息体描述了媒体服务器接收媒体流的IP、端口、媒体格式等内容;
- SIP服务器收到媒体服务器返回的200 OK,向媒体流发送者发送INVITE请求,请求中携带步骤3)中媒体服务器回复的200 OK响应消息体,s字段为"Play"代表实时点播,y字段描述SSRC值,f字段描述媒体参数;
- 媒体流发送者接收SIP服务器的INVITE请求,回复200 OK,携带SDP消息体,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等;
- SIP服务器接收媒体流发送者返回的200 OK,向媒体服务器发送ACK请求,请求中携带步骤5)媒体流发送者回复的200 OK响应消息体,完成与媒体服务器INVITE会话建立过程;
- SIP服务器接收媒体流发送者返回的200 OK,向媒体流发送者发送ACK请求,请求中不携带消息体,完成与媒体流发送者INVITE会话建立过程;
- 完成三方呼叫控制后,SIP服务器通过B2BUA代理方式建立媒体流接收者与媒体服务器之间的媒体连接,在消息1中增加SSRC值,转发给媒体服务器;
- 媒体服务器收到INVITE请求,回复200 OK,携带SDP消息体,消息体中描述了媒体服务器发送媒体流的IP、端口、媒体格式、SSRC等;
- SIP服务器将消息9转发给媒体流接收者;
- 媒体流接收者收到200 OK,回复ACK,完成与SIP服务器的INVITE会话建立过程;
- SIP服务器将消息11转发给媒体服务器,完成与媒体服务器的INVITE会话建立过程;
- 媒体流接收者向SIP服务器发送BYE,断开消息1、10、11建立的同媒体流接收者的INVITE会话;
- SIP服务器收到BYE,回复200 OK,会话断开;
- SIP服务器收到BYE向媒体服务器发送BYE,断开消息8、9、12建立的同媒体服务器的INVITE会话;
- 媒体服务器收到BYE,回复200 OK,会话断开;
- SIP服务器向媒体服务器发送BYE,断开消息2、3、6建立的同媒体服务器的INVITE会话;
- 媒体服务器收到BYE,回复200 OK,会话断开;
- SIP服务器向媒体流发送者发送BYE,断开消息4、5、7建立的同媒体流发送者的INVITE会话;
- 媒体流发送者收到BYE,回复200 OK,会话断开;
协议
- 消息头域Allow字段应支持INVITE、ACK、INFO、CANCEL、OPTIONS、MESSAGE方法;
- 消息头Content-type字段应为Content-type:application/sdp;
- SDP文本信息包括会话名称和意图、会话持续时间、构成会话的媒体、有关接收媒体的信息;
- 源设备在SDP协议格式消息体中包括t行,t行的开始时间和结束时间都设置为0,表示实时视音频点播;
- SDP协议格式中o行表示本设备的设备编码,c行表示设备或系统IP地址,m行为媒体接收端口号;
SDP字段说明
- 示例
v=0
o=xxx 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=video 36000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=xxx
- 说明
SDP字段说明:
v字段:协议版本
o字段:-
a字段:a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>] 中的<encoding name>,利用该属性携带编码器厂商名称。该属性表明该流为某厂商编码器编码且是不符合gb28181规定的媒体流,符合国标的媒体流不需要该属性。
例如:a=rtpmap:96 DAHUA/90000
a=rtpmap:96 HIKVISION/90000
a字段有下列格式:
a字段可携带倍数参数,用于文件下载时控制下载速度。格式: a=downloadspeed:下载倍数(整型)
a字段可携带文件大小参数,用于文件下载时的进度计算。格式: a=filesize:文件大小 (单位:Byte)
a字段可携带setup、connection作为TCP连接协商参数。 a=setup:TCP连接方式(表示本SDP发送者在建立RTP over TCP连接时是主动还是被动发起TCP连接,“active”为主动,“passive”为被动)
a字段可携带SVC参数,用于视频传输时的分辨率或者帧频控制。a=svcspace:空域编码方式 【取值整型。 0:不使用 1:1级增强 2:2级增强 3:3级增强 】 a = svctime:时域编码方式
s字段:表示请求媒体流的操作类型,“Play”标识为点播请求 “Playback”标识回播请求 “Download”表示文件下载 “Talk”表示语音对讲;
u字段:u行应填写视音频文件的URL。该URL的取值有两种:简捷方式和普通方式。简捷方式直接采用产生该历史媒体的媒体源(如某个摄像头)的设备ID以及相关参数,参数用“:”分隔;普通方式采样http://储存设备ID[/文件夹]*/文件名;
m字段:描述媒体的媒体类型、端口、传输层协议、负载类型等内容。媒体类型采样“video”标识视频或者视音频混合内容,采样“audio”标识传输音频内容;传输方式采用“RTP/AVP”标识传输层协议为 RTP over UDP,采用“TCP/RTP/AVP”标识传输层协议为RTP over TCP;
t字段:当回放或者下载时,t行值为开始时间,结束时间,采样“ ”分隔;
y字段:十进制整数字符串,标识SSRC值。其中第一位为历史或者实时媒体流的标识位,0为实时,1为历史;第2位到第6位取20位SIP监控域ID之中的4-8位作为域标识;第7-10位作为域内媒体流标识,是一个与当前域内产生的媒体流SSRC值后4位不充分的四位十进制整数;
f字段:f=v/编码格式/分辨率/帧率/码率类型/码率大小 a/编码格式/码率大小/采样率 其中v表示video a表示audio
测试
操作
-
注册;
-
注册成功后,输入点播需要的参数,点击开始按钮;
参数分析:
- 通道编号:视频通道编码ID,如图所示;
- 设备ip
- 设备端口
- 本地ip
- 本地接收port:流媒体服务器的接收端口,用作数据接收;
抓包
- 截图1表示发送INVITE请求;
- 截图2表示接收数据,数据封装格式为PS;
xml分析
- 发送INVITE请求(107—>111)
INVITE sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=
Max-Forwards: 70
From: sip:xxx@192.168.0.107:5060;tag=
To: sip:xxx@192.168.0.111:5060
Contact: <sip:xxx@192.168.0.107:5060>
Call-ID:
CSeq: 18467 INVITE
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, PRACK
Supported: 100rel
Subject: xxx:xx,xxx:xx
Content-Type: application/sdp
Content-Length: 211
v=0
o=xxx 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=video 36000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=0100000001
- 接收INVIE请求响应(100 Trying 111—>107)
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=
From: <sip:xxx@192.168.0.107:5060>;tag=
To: <sip:xxx@192.168.0.111:5060>
Call-ID:
CSeq: 18467 INVITE
User-Agent: IP Camera
Content-Length: 0
- 接收INVITE请求响应(200 OK 111—>107)
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=
From: <sip:xxx@192.168.0.107:5060>;tag=
To: <sip:xxx@192.168.0.111:5060>;tag=
Call-ID:
CSeq: 18467 INVITE
Contact: <sip:xxx@192.168.0.111:5060>
Content-Type: application/sdp
User-Agent: IP Camera
Content-Length: 187
v=0
o=xxx 2243 2243 IN IP4 192.168.0.111
s=Play
c=IN IP4 192.168.0.111
t=0 0
m=video 15060 RTP/AVP 96
a=sendonly
a=rtpmap:96 PS/90000
a=filesize:0
y=0100000001
- 接收返回响应(107—>111)
ACK sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=
Max-Forwards: 70
From: sip:xxx@192.168.0.107:5060;tag=
To: sip:xxx@192.168.0.111:5060;tag=
Call-ID:
CSeq: 18467 ACK
Content-Length: 0
- 断开连接(111—>107 由于暂未实现流媒体服务器,设备检测到数据接收端口不可用,主动断开连接)
BYE sip:xxx@192.168.0.107:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=
From: <sip:xxx@192.168.0.111:5060>;tag=
To: <sip:xxx@192.168.0.107:5060>;tag=
Call-ID:
CSeq: 2 BYE
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 0
- 断开连接响应(107—>111)
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.111:5060;rport=5060;received=192.168.0.111;branch=
Call-ID:
From: <sip:xxx@192.168.0.111:5060>;tag=
To: <sip:xxx@192.168.0.107:5060>;tag=
CSeq: 2 BYE
Content-Length: 0