欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

onvif 语音对讲

程序员文章站 2022-07-01 09:55:20
...

onvif 语音对讲

前言

在视频监控应用场景中,有很多场景需要采集查看监控的人的语音发送到监控摄像头的音响上去以实现对被监控对象的语音控制。
ONVIF Core Specification Core_2.00文档中章节12.3 Back Channel Connection对此进行了详细的描述。
ONVIF语音对讲的实现完全基于RTSP协议,流程中没有用到ONVIF协议。

RTSP Require-Tag

RTSP 标准[RFC 2326]可以通过添加额外的头进行扩展,引入Requiretag 用于处理特殊的功能扩展(参考 [RFC
2326], 1.5 Extending Rtsp and 12.32 Require).
Require头用来判定是否支持某个特性,如果要求server理解支持某个特性并正确处理请求,需要对server的每个请求都携带这个Require头。
server如果支持backchannel这个特性,需要理解该特性所对应的tag:

  • www.onvif.org/ver20/backchannel

如果client想要建立一个包含backchannelRTSP连接,在这一系列请求(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命令同时开始了ClientNVT获取音频流和视频流以及从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”

参考

ONVIF Core Specification Core_2.00