💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。
概述
Onvif协议的核心作用之一,是定义了如何通过网络访问和控制IP摄像机和其他视频设备。Onvif协议不仅涉及设备发现、设备管理,还包括音视频流的配置和传输。设备的配置和控制通过SOAP协议实现,而音视频流传输主要基于RTSP协议进行。这一架构使得设备的配置和实时媒体流的传输得以分离,既保证了灵活性,又增强了安全性。
如果对RTSP协议感兴趣,可以移步至专栏《从零开始精通RTSP》进行学习。
工作流程
客户端使用Onvif协议和RTSP协议向设备拉流的基本工作流程如下。
首先,客户端通过发送GetProfiles请求获取设备预设的配置文件列表,每个配置文件定义了视频流的参数,比如:编码算法、分辨率、帧率等。选择合适的配置后,使用GetStreamUri方法获取具体的音视频流地址,这个地址通常是RTSP URL。
获取到流地址后,客户端通过RTSP协议与设备建立会话。这通常包括:发送OPTIONS请求获取设备的RTSP能力,然后发送DESCRIBE请求获取流的SDP描述;接下来,客户端发送SETUP请求选择传输通道和参数,最后通过PLAY命令开始音视频流的传输。
一旦RTSP会话建立并开始播放,设备便将音视频数据通过RTP封装传输给客户端。客户端解封装这些数据包,解码后即可进行音视频的渲染。在音视频流的传输过程中,客户端还可以通过RTSP的控制命令(比如:PAUSE、TEARDOWN)来暂停或结束流。
获取拉流URL
Onvif协议中的GetStreamUri方法是Media Service服务的一部分,主要用于获取网络视频设备上音视频流的访问URL。这个URL允许客户端通过标准的流媒体协议,比如:RTSP、HTTP等,来拉取实时的音视频数据流。
获取拉流URL的请求比较简单,可以参考下面的SOAP报文,其中的一些关键节点和属性描述如下。
<onv:ProfileToken>:必填项,表示设备上特定的配置文件的唯一标识符。配置文件定义了视频流的多个参数,比如:分辨率、帧率、编码格式等。
<onv:Protocol>:可选项,指定客户端期望使用的流传输协议(比如:RTSP、HTTP等)。如果不指定,默认值由设备决定,通常为RTSP,因为它是流媒体传输的常用标准协议。
<soapenv:Envelope ...><soapenv:Body><onv:GetStreamUri><onv:ProfileToken>Profile_1</onv:ProfileToken><onv:Protocol>RTSP</onv:Protocol></onv:GetStreamUri></soapenv:Body>
</soapenv:Envelope>
当设备接收到请求拉流URL的SOAP请求报文并成功处理后,会返回一个包含拉流URI的SOAP响应报文给客户端。可以参考下面的示例报文来进行理解,其中的一些关键节点和属性描述如下。
<onv:MediaUri>:表示媒体资源的URI信息。
<onv:Uri>:表示拉流的URL。通过这个URL,客户端可以获取到设备的音视频流数据。
<soapenv:Envelope ...><soapenv:Body><onv:GetStreamUriResponse><onv:MediaUri><onv:Uri>rtsp://192.168.1.100:554/channel0/h264</ns0:Uri><!-- 其他可选信息,比如:流的类型、格式、有效期等 --></onv:MediaUri></onv:GetStreamUriResponse></soapenv:Body>
</soapenv:Envelope>