我有网络网络摄像机(佳能VB-M40)。此相机支持 ONVIF 协议。我正在使用C语言在窗口中实现其ONVIF功能。我使用以下请求获得了它的 RTSP URI。
snprintf(postData, sizeof(postData),
"<?xml version="1.0" encoding="utf-8"?>"
"<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" "
"xmlns:tds="http://www.onvif.org/ver10/media/wsdl""
"xmlns:tt="http://www.onvif.org/ver10/schema">"
"<soap:Body>"
"<tds:GetStreamUri>"
"<tds:StreamSetup>"
"<tt:Stream>0</tt:Stream>"
"<tt:Transport>"
"<tt:Protocol>HTTP</tt:Protocol>"
"</tt:Transport>"
"</tds:StreamSetup>"
"<tds:ProfileToken>profile1</tds:ProfileToken>"
"</tds:GetStreamUri>"
"</soap:Body></soap:Envelope>",
username, digest_str, nonce_str, time_str);
响应是:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa5="http://www.w3.org/2005/08/addressing"
xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:MC2="http://www.onvif.org/ver10/schema"
xmlns:MC3="http://www.w3.org/2005/05/xmlmime"
xmlns:MC4="http://docs.oasis-open.org/wsn/b-2"
xmlns:MC10="http://www.w3.org/2004/08/xop/include"
xmlns:MC5="http://docs.oasis-open.org/wsrf/bf-2"
xmlns:MC6="http://docs.oasis-open.org/wsn/t-1"
xmlns:CC="http://www.canon.com/ns/networkcamera/onvif/va/schema"
xmlns:MC1="http://www.onvif.org/ver10/media/wsdl"
xmlns:MC8="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding"
xmlns:MC9="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding"
xmlns:MC7="http://www.onvif.org/ver20/analytics/wsdl"
xmlns:ter="http://www.onvif.org/ver10/error"
xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
xmlns:tns1="http://www.onvif.org/ver10/topics">
<SOAP-ENV:Header></SOAP-ENV:Header>
<SOAP-ENV:Body>
<MC1:GetStreamUriResponse>
<MC1:MediaUri>
<MC2:Uri>rtsp://192.168.5.53:8090/profile1=r</MC2:Uri>
<MC2:InvalidAfterConnect>false</MC2:InvalidAfterConnect>
<MC2:InvalidAfterReboot>true</MC2:InvalidAfterReboot>
<MC2:Timeout>PT0M0S</MC2:Timeout>
</MC1:MediaUri>
</MC1:GetStreamUriResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
根据 ONVIF 规范,一旦我获得流 URI,我应该向设备发送"描述"请求。我正在使用此过程,因为我需要 TCP 上的流。
我的问题是如何向设备发送"描述"请求以及在哪个套接字上?
我是否应该在发送 GetStreamURI 请求的同一套接字上发送此请求。或者我必须创建一个另一个。请求的格式是什么?
将其发送到端口 554(或设备中为 RTSP 配置的其他端口)上的 GetStreamUri 请求相同的主机。然后,您必须在描述之前发送选项请求。它可能会在其正文中返回 401 未授权状态和随机数 + 领域值。(我使用的是您在 GetStreamUri 响应中收到的不同地址。
Request:
OPTIONS http://192.168.128.99:80/profile1/media.smp RTSP/1.0rn
CSeq: 1rn
User-Agent: MyAgentrnrn
Response:
RTSP/1.0 401 Unauthorized
CSeq: 1
Date: Thu Jun 28 05:39:55 2012 GMT
Expires: Thu Jun 28 05:39:55 2012 GMT
Cache-Control: must-revalidate
WWW-Authenticate: Digest realm="iPOLiS", nonce="00000000000000000000000048E02F14"
读取此领域和随机数值,因为您需要它进行自动化并发送另一个授权的 OPTIONS 请求。
OPTIONS http://192.168.128.99:80/profile1/media.smp RTSP/1.0rn
CSeq: 2rn
Authorization: Digest username="admin", realm="iPOLiS", nonce="00000000000000000000000048E02F14", uri="http://192.168.128.99:80/profile1/media.smp", response="23a5a81fb98b6cb29368eba060ba31b9"rn
User-Agent: MyAgentrnrn
以这种方式生成响应
然后来描述请求
DESCRIBE http://192.168.128.99:80/profile1/media.smp RTSP/1.0rn
CSeq: 3rn
User-Agent: MyAgentrnrn
和响应
RTSP/1.0 200 OK
CSeq: 3
Date: Thu Jun 28 05:46:20 2012 GMT
Expires: Thu Jun 28 05:46:20 2012 GMT
Content-Base: http://192.168.128.99:554/profile1/media.smp/
Content-Type: application/sdp
Content-Length: 498
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Cache-Control: must-revalidate
v=0
o=- 0 0 IN IP4 192.168.128.9
s=Media Presentation
i=samsung
c=IN IP4 0.0.0.0
b=AS:384128
t=0 0
a=control:http://192.168.128.99:554/profile1/media.smp
a=range:npt=now-
m=video 40336 RTP/AVP 26
b=AS:384000
a=rtpmap:26 JPEG/90000
a=control:http://192.168.128.99:554/profile1/media.smp/trackID=v
a=cliprect:0,0,768,1024
a=framesize:26 1024-768
a=framerate:5.0
m=audio 40338 RTP/AVP 0
b=AS:64
a=rtpmap:0 PCMU/8000
a=control:http://192.168.128.99:554/profile1/media.smp/trackID=a
从 a=control:http://192.168.128.99:554/profile1/media.smp/trackID=v 中的此响应地址应解析为媒体 m=video(它是一个 SDP 协议)。这就是我走了多远。下一个过程应该是使用传输信息发出 SETUP 请求,然后发送 PLAY 请求。您必须侦听在 SETUP 请求中指定的端口才能接收图像。