onvif 语音对讲
onvif 语音对讲
前言
在视频监控应用场景中,有很多场景需要采集查看监控的人的语音发送到监控摄像头的音响上去以实现对被监控对象的语音控制。ONVIF Core Specification Core_2.00文档
中章节12.3 Back Channel Connection
对此进行了详细的描述。ONVIF
语音对讲的实现完全基于RTSP
协议,流程中没有用到ONVIF
协议。
RTSP Require-Tag
RTSP 标准[RFC 2326]可以通过添加额外的头进行扩展,引入Require
tag 用于处理特殊的功能扩展(参考 [RFC
2326], 1.5 Extending Rtsp and 12.32 Require).Require
头用来判定是否支持某个特性,如果要求server
理解支持某个特性并正确处理请求,需要对server
的每个请求都携带这个Require
头。server
如果支持backchannel
这个特性,需要理解该特性所对应的tag:
www.onvif.org/ver20/backchannel
如果client想要建立一个包含backchannel
的RTSP
连接,在这一系列请求(SUBSCRIBE,SETUP,PLAY,PAUSE,TEARDWON)中需要包含这个Require www.onvif.org/ver20/backchannel
头。
DESCRIBE
在Client - Server
发送DESCRIBE
协议的时候添加前文说过的Require-tag
,这时如果Server
不支持语音对讲则会回复551 Option not supported
,示例如下:
Client – Server: DESCRIBE rtsp://192.168.0.1 RTSP/1.0
CSeq: 1
User-Agent: ONVIF Rtsp client
Accept: application/sdp
Require: www.onvif.org/ver20/backchannel #!! Require-tag
Server – Client: RTSP/1.0 551 Option not supported
CSeq: 1
Unsupported: www.onvif.org/ver20/backchannel
如果支持语音对讲的话,则会回复200 OK
并携带sdp
信息:
RTSP/1.0 200 OK
CSeq: 1
Content-Type: application/sdp
Content-Length: xxx
v=0
o= 2890842807 IN IP4 192.168.0.1
s=RTSP Session with audiobackchannel
m=video 0 RTP/AVP 26
a=control:rtsp://192.168.0.1/video
a=recvonly
m=audio 0 RTP/AVP 0
a=control:rtsp://192.168.0.1/audio
a=recvonly
m=audio 0 RTP/AVP 0
a=control:rtsp://192.168.0.1/audioback
a=rtpmap:0 PCMU/8000
a=sendonly
上面的sdp
列出了三个流及其控制URL
: 视频流:rtsp://192.168.0.1/video
,音频流:rtsp://192.168.0.1/audio
,以及我们的主角对讲流rtsp://192.168.0.1/audioback
,注意对讲流的属性a=sendonly与其他流的a=recvonly不同。
SETUP
接下来我们就可以SETUP
这些session
:
Client – Server: SETUP rtsp://192.168.0.1/video RTSP/1.0
CSeq: 2
Transport: RTP/AVP;unicast;client_port=4588-4589
Server – Client: RTSP/1.0 200 OK
CSeq: 2
Session: 123124;timeout=60
Transport:RTP/AVP;unicast;client_port=4588-4589;
server_port=6256-6257
Client – Server: SETUP rtsp://192.168.0.1/audio RTSP/1.0
CSeq: 3
Session: 123124
Transport: RTP/AVP;unicast;client_port=4578-4579
Server – Client: RTSP/1.0 200 OK
CSeq: 3
Session: 123124;timeout=60
Transport:RTP/AVP;unicast;client_port=4578-4579;
server_port=6276-6277
Client – Server: SETUP rtsp://192.168.0.1/audioback RTSP/1.0
CSeq: 4
Session: 123124
Transport: RTP/AVP;unicast;client_port=6296-6297
Require: www.onvif.org/ver20/backchannel
Server – Client: RTSP/1.0 200 OK
CSeq: 4
Session: 123124;timeout=60
Transport:RTP/AVP;unicast;client_port=6296-6297;
server_port=2346-2347
上面setup
了三次,分别建立了视频流,音频流以及位于最后的音频对讲流的连接。
PLAY
由于rtsp
有集合控制的功能,仅需要发送一条PLAY
或者PAUSE
就可以同时控制多个音频流和视频流。所以下面我们发送一条PLAY
请求即可:
Client – Server: PLAY rtsp://192.168.0.1 RTSP/1.0
CSeq: 5
Session: 123124
Require: www.onvif.org/ver20/backchannel
Server – Client: RTSP/1.0 200 OK
CSeq: 5
Session: 123124;timeout=60
在收到PLAY
请求的200 OK
的回复之后,客户端就可以向Server
发送音频数据包了,Client
不应该在收到回复之前就开始发送数据包。
上面例子中的Require: www.onvif.org/ver20/backchannel
头指明了这个特殊的解释对于PLAY
命令是必须的。PLAY
命令同时开始了Client
从NVT
获取音频流和视频流以及从Client
发送到Server
的对讲流。
TEARDOWN
通过发送TEARDOWN
请求来关闭这个包含三个流的session
:
Client – NVT: TEARDOWN rtsp://192.168.0.1 RTSP/1.0
CSeq: 6
Session: 123124
Require: www.onvif.org/ver20/backchannel
NVT – Client: RTSP/1.0 200 OK
CSeq: 6
Session: 123124
Multicast Streaming
如果客户端要发送语音广播给多个摄像头,那么它需要使用SETUP
请求中的transport
参数来告诉Server
多播地址和端口
Client – Server: SETUP rtsp://192.168.0.1/audioback RTSP/1.0
CSeq: 4
Session: 123124
Transport:RTP/AVP;multicast;destination=224.2.1.1;port=60
000-60001;ttl=128
Require: www.onvif.org/ver20/backchannel
Server – Client: RTSP/1.0 200 OK
CSeq: 4
Session: 123124;timeout=60
Transport:RTP/AVP;multicast;destination=224.2.1.1;port=60
000-60001;ttl=128;mode=”PLAY”
参考
推荐阅读