【miscellaneous】海康相机RTSP连接代码分析
海康相机RTSP连接代码分析
最近在做海康相机rtsp连接获取音视频的工作,现在介绍一下分析过程和源码。
【源码在我上传的共享资料中: http://download.csdn.net/detail/zhouyongku/8203521】
一、基本原理
RTSP客户端去连接服务器的最基本步骤如下:
(1)分析url中的端口号,创建一个与服务器[S-PORT]端口号的TCP连接用于RTSP命令交互
(2)执行RTSP命令请求,告诉服务器可以连接到本地的端口[C-PORT]进行数据发送
(3)客户端从本地[C-PORT]读取数据
二、研究步骤
来研究一下海康相机的RTSP数据是怎么交互的
(1)打开Wireshark,选择"抓包"->"网络接口"->选择网卡->“开始”,在"过滤“栏输入"rtsp",屏蔽不相关信息。
(2)打开VLC播放器,输入海康相机RTSP地址
例如:【rtsp://admin:12345@192.168.1.145:554/MPEG-4/ch2/main/av_stream】
(3)播放几秒后再点击停止播放,退出VLC播放器。
(4)分析Wireshark数据
三、RTSP协议过程分析
1、RTSP协议梗概
就这几个简单的交互命令就能实现RTSP对接,C代表Client S代表Server
例如:C1-客户端发的第一个命令 S1-服务器响应的第一个回复
【C1】OPTIONS rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0RTSP
【S1】Reply: RTSP/1.0 200 OK RTSP
【C2】DESCRIBE rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0RTSP
【S2】Reply: RTSP/1.0 401 Unauthorized RTSP
【C3】DESCRIBE rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0RTSP
【S3】Reply: RTSP/1.0 200 OK, with session descriptionRTSP/SDP
【C4】SETUP rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=1 RTSP/1.0RTSP
【S4】Reply: RTSP/1.0 200 OK RTSP
【C5】SETUP rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=2 RTSP/1.0RTSP
【S5】Reply: RTSP/1.0 200 OK RTSP
【C6】PLAY rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/ RTSP/1.0RTSP
【S6】Reply: RTSP/1.0 200 OK RTSP
【C7】GET_PARAMETER rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/ RTSP/1.0RTSP
【S7】Reply: RTSP/1.0 200 OK RTSP
【C8】TEARDOWN rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/ RTSP/1.0RTSP
【S8】Reply: RTSP/1.0 200 OK RTSP
2、请求OPTION
【C1-OPTION】
Request: OPTIONS rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0\r\n
CSeq: 2\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
\r\n
询问RTSP服务器有哪些命令可以使用
【S1-REPLY】
Response: RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER\r\n
Date: Thu, Nov 27 2014 11:59:41 GMT\r\n
服务器回应客户端的请求。这个回应第一行为OK,则表明服务器接受查询命令,并且反馈给客户端信息,可以使用的命令有:OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER,则下一步就可以向服务器发送这些命令,如果没有,则服务器不接收这些命令。
3、无验证请求资源描述DESCRIBE
【C2-DESCRIBE】
Request: DESCRIBE rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0\r\n
CSeq: 3\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Accept: application/sdp\r\n
\r\n
请求RTSP服务器描述自身有哪些音视频资源
【S2-REPLY】
Response: RTSP/1.0 401 Unauthorized\r\n
CSeq: 3\r\n
WWW-Authenticate: Digest realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", stale="FALSE"\r\n
WWW-Authenticate: Basic realm="4419b727ab09"\r\nDate: Thu, Nov 27 2014 11:59:41 GMT\r\n
服务器回应客户端的请求。第一行为Unauthorized,表明认证不成功服务器拒绝给出拥有的资源,因此我们需要再次发送认证的请求到服务器,则服务器才能给出拥有的资源
4、认证请求资源描述DESCRIBE
【C3-DESCRIBE】
Request: DESCRIBE rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream RTSP/1.0\r\n
CSeq: 4\r\n
Authorization: Digest username="admin", realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", uri="rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream", response="108084646408d21aa255664781c886fc"\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Accept: application/sdp\r\n
\r\n
发送具有认证标识的信息到服务器,去获取服务器的资源列表。怎样的格式算正确认证的信息?这个关键在于response字段。[S2-REPLY]中反馈了两个信息realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727",**************************************response区域的计算规则如下***********************************
(1)当password为MD5编码,则response = md5(<password>:<nonce>:md5(<cmd>:<url>));(2)当password为ANSI字符串,则response = md5(md5(<username>:<realm>:<password>):<nonce>:md5(<cmd>:<uri>));***********************************************************************************************************
其中 password=密码,nonce=服务器返回的nonce,cmd=当前命令(DESCRIBE、SETUP等),realm=服务器返回的reaml,uri=请求的uri地址.当服务器接收到response为108084646408d21aa255664781c886fc的时候,服务器也会用这一套公式去计算,当发现计算出的值与客户端提供的值吻合的时候,则表明用户名和密码校验成功!
/*MD5加密函数*/int md5_hash(const void *buff, size_t len, char *hexsum);<span style="white-space:pre"> </span>/*发送具有response认证的describe命令函数*/void RtspRequest::SendRegisterRequest(string requestType){string requestCmd;char cseq[256];char session[256];char author[500] = { 0 };char acc[200] = { 0 };char szInput[200] = { "" };char szOutput[200] = { 0 };char szMd5Pwd[200] = { 0 };char szmd5methorduri[200] = { 0 };m_CSeq++;if (m_SetupName.length()){requestCmd = requestType;requestCmd += " ";requestCmd += m_RequestsMrl;requestCmd += "/";requestCmd += m_SetupName;requestCmd += " RTSP/1.0";m_SetupName = "";}else{requestCmd = requestType;requestCmd += " ";requestCmd += m_RequestsMrl;requestCmd += " RTSP/1.0";}//当password为ANSI字符串 response = md5(md5(<username>:<realm>:<password>):<nonce>:md5(<cmd>:<uri>));//md5(<username>:<realm>:<password>)=md5(admin:4419b727ab09:12345)=fa47d934c754db5ebebd9b42a4412073sprintf_s(szInput, 200, "%s:%s:%s", m_uername.c_str(), m_realm.c_str(), m_password.c_str());md5_hash(szInput, strlen(szInput), szMd5Pwd);//md5(<cmd>:<uri>)=md5(DESCRIBE:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream) =0b0a4e77e852876bdfdf6ecb72ba3900sprintf_s(szInput, 200, "DESCRIBE:%s", m_RequestsMrl.c_str());md5_hash(szInput, strlen(szInput), szmd5methorduri);//md5(md5(<username>:<realm>:<password>):<nonce>:md5(<cmd>:<uri>));//=md5(fa47d934c754db5ebebd9b42a4412073:66bb9f0bf5ac93a909ac8e88877ae727:0b0a4e77e852876bdfdf6ecb72ba3900)<span style="white-space:pre"> </span>//=108084646408d21aa255664781c886fc//关于这一条,http://www.3464.com/Tools/MD5/index.asp 网站给出的结论则不一致:98f90a583e5c436f83da956c9b00767b<span style="white-space:pre"> </span>//我的代码给出的值与VLC和其它工具给出的值完全匹配sprintf_s(szInput, 200, "%s:%s:%s", szMd5Pwd, m_nonce.c_str(), szmd5methorduri);md5_hash(szInput, strlen(szInput), szOutput);m_response = szOutput;_snprintf(cseq, 256, "CSeq: %u", m_CSeq);_snprintf(author, 500, "Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",m_uername.c_str(), m_realm.c_str(), m_nonce.c_str(), m_RequestsMrl.c_str(), m_response.c_str());_snprintf(acc, 500, "Accept: application/sdp");if (requestType.compare("TEARDOWN") == 0)m_Session = 0;_snprintf(session, 256, "Session: %I64u", m_Session);Write(requestCmd.c_str());Write(cseq);Write(author);Write("User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)");Write(acc);if (m_Session > 0)Write(session);WriteFields();Write("");}【S3-REPLY】
Response: RTSP/1.0 200 OK\r\n
CSeq: 4\r\n
Content-type: application/sdp
Content-Base: rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/\r\n
Content-length: 672
\r\n
Session Description Protocol
Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): - 1417089581269778 1417089581269778 IN IP4 192.168.1.145
Session Name (s): Media Presentation
E-mail Address (e): NONE
Bandwidth Information (b): AS:5100
Time Description, active time (t): 0 0
Session Attribute (a): control:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/
Media Description, name and address (m): video 0 RTP/AVP 96
Bandwidth Information (b): AS:5000Media Attribute (a): control:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=1Media Attribute (a): rtpmap:96 H264/90000Media Attribute (a): fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z0KAH4iLUCgC3QgAADhAAAr8gCA=,aM44gA==Media Description, name and address (m): audio 0 RTP/AVP 0
Bandwidth Information (b): AS:50Media Attribute (a): control:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=2Media Attribute (a): rtpmap:0 PCMU/8000Media Attribute (a): Media_header:MEDIAINFO=494D4B48010100000400010010710110401F000000FA000000000000000000000000000000000000;Media Attribute (a): appversion:1.0首先第一行给了OK,表明上一个命令成功--DESCRIBE成功得到服务器认证
其次,给出了服务器的媒体信息-具有两路码流--音频(audio)和视频(video) 并给出了请求两路数据的地址
5、请求视频资源
【C4-SETUP】
Request: SETUP rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=1 RTSP/1.0\r\nCSeq: 5\r\n
Authorization: Digest username="admin", realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", uri="rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/", response="dfd7cfc85819d15d622e4491ad12217d"\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Transport: RTP/AVP;unicast;client_port=56732-56733
\r\n
请求获取流媒体服务器上的视频资源 并告知服务器可以往客户端56732端口发送视频数据,56733为RTCP接收端口,发送方式为单播。传输方式为UDP**********************传输方式与Transport string的对应关系**********************
UDP传输:Transport:RTP/AVP
TCP传输:Transport:RTP/AVP/TCPRAW UDP传输:Transport:RAW/RAW/UDP
****************************************************************************************
【S4-REPLY】
Response: RTSP/1.0 200 OK\r\nCSeq: 5\r\n
Session: 1350856257;timeout=60
Transport: RTP/AVP;unicast;client_port=56732-56733;server_port=8208-8209;ssrc=4a3a67d5;mode="play"
Date: Thu, Nov 27 2014 11:59:41 GMT\r\n
\r\n
服务器同意发送视频数据给客户端 56732为视频接收端,56733为RTCP接收端口,发送方式为单播。传输方式为UDP
6、请求音频资源
【C5-SETUP】
Request: SETUP rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=2 RTSP/1.0\r\nCSeq: 6\r\n
Authorization: Digest username="admin", realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", uri="rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/", response="dfd7cfc85819d15d622e4491ad12217d"\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Transport: RTP/AVP;unicast;client_port=56734-56735
Session: 1350856257
\r\n
请求获取服务器上的音频资源 并告知服务器可以往客户端56734端口发送视频数据,56735为RTCP接收端口,发送方式为单播。传输方式为UDP
【S5-REPLY】
Response: RTSP/1.0 200 OK\r\nCSeq: 6\r\n
Session: 1350856257;timeout=60
Transport: RTP/AVP;unicast;client_port=56734-56735;server_port=8226-8227;ssrc=232306b5;mode="play"
Date: Thu, Nov 27 2014 11:59:41 GMT\r\n
\r\n
服务器同意发送音频数据给客户端 56734为视频接收端,56735为RTCP接收端口,发送方式为单播。传输方式为UDP
7、开始数据接收
【C6-PLAY】
Request: PLAY rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/ RTSP/1.0\r\nCSeq: 7\r\n
Authorization: Digest username="admin", realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", uri="rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/", response="4c4e89a5894d2b208489fde1aeaf9e44"\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Session: 1350856257
Range: npt=0.000-\r\n
\r\n
告知服务器一切准备就绪,数据可以发过来了!come on baby!
【S6-REPLY】
Response: RTSP/1.0 200 OK\r\nCSeq: 7\r\n
Session: 1350856257
RTP-Info: url=rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=1;seq=31283;rtptime=1712470431,url=rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=2;seq=3370;rtptime=1846536290\r\n
Date: Thu, Nov 27 2014 11:59:41 GMT\r\n
\r\n
服务器告知客户端,朋友我已经送数据过来了,你可以接收了!这个时候我们打开Wireshark,在过滤栏输入rtp,可以看到如下数据,表明服务器已经向客户端的56732、56734端口发送数据
RTP拆包到图像显示和音频播放,会在我的下一篇博客中详细解释
8、关闭播放
【C7-TEARDOWN】
Request: TEARDOWN rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/ RTSP/1.0\r\nMethod: TEARDOWN
URL: rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/
CSeq: 9\r\n
Authorization: Digest username="admin", realm="4419b727ab09", nonce="66bb9f0bf5ac93a909ac8e88877ae727", uri="rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/", response="af15346442151a51f1478da1858778d5"\r\n
User-Agent: LibVLC/2.1.3 (LIVE555 Streaming Media v2014.01.21)\r\n
Session: 1350856257
\r\n
关闭数据传输 释放服务器资源 如果需要重新获取码流 则需要从1~6再来一次
【S7-REPLY】
Response: RTSP/1.0 200 OK\r\nStatus: 200
CSeq: 9\r\n
Session: 1350856257
Date: Thu, Nov 27 2014 11:59:42 GMT\r\n
\r\n
服务器已经成功关闭当前链接
本文引用:http://blog.163.com/seek_for/blog/static/1116353920116154386537/
【miscellaneous】海康相机RTSP连接代码分析的更多相关文章
- 海康相机开发(1) SDK安装和开发
1.1 安装包获取 从官网下载最新版本的MVS安装包,支持Windows xp.Windows 7.Windows 8.Windows 10的32和64位系统.安装过程默认即可. 官网下载链接:htt ...
- 海康相机SDK二次开发只有视频无声音问题
海康SDK相信做企业开发的的同仁,在项目中经常会用到,毕竟使用范围这么广. 本次就开发遇到的奇葩问题来说明一下我们的解决方案. 场景 虽然海康有4200客户端,但是对于高度定制化的项目,肯定不能再使用 ...
- 海康ipc onvif抓包分析
型号:半球DS-2CD2122FWD-IWS 子码流的地址(101+1): rtsp://admin:hik12345@10.7.36.222:554/Streaming/Channels/102?t ...
- (HK1-2)海康相机直接连接电脑不经过路由器设置
解决电脑无法通过网线直连海康摄像机的问题 https://blog.csdn.net/u014552102/article/details/86708371 一.现象: 通过博主的另外一篇博客h ...
- 用libevent写的海康摄像头rtsp客户端
之前一直使用live555作为RTSP的客户端,但其框架臃肿,虽然支持各种格式,但实际中并没有这些需求,关键是其注重于格式的解析,却不注重网络IO,单线程下性能也不高,重新用libevent编写rts ...
- 配置海康相机SDK文件
前言 项目使用到海康摄像机,进行二次开发需要首先对SDK文件进行相关配置. 实现过程 1.下载SDK开发包: 网址:http://www.hikvision.com/cn/download_61.ht ...
- 使用ffmpeg将海康视频rtsp转为hls
测试环境: Ubuntu14.04 LTS Desktop ffmpeg version 3.3.3 命令行运行: ffmpeg -i rtsp://admin:12345@10.0.10.19:55 ...
- rtsp学习----海康RTSP客户端连接深入分析
转载于:http://blog.csdn.net/zhouyongku/article/details/41546789 海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作,现 ...
- 海康、大华IpCamera RTSP地址和格式
海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...
随机推荐
- Centos7静态ip设置(亲测有效)
本文引自:https://www.cnblogs.com/toov5/p/10340395.html,特此鸣谢 最近想测试消息中间件等各类web集群相关技术,这就需要解决linux主机之间互联互通的若 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)
题目链接:https://codeforc.es/gym/101933/problem/A 题意:有 n 只青蛙在一个坑里面,要求可以跳出坑的青蛙的最大数量.每个青蛙有 3 种属性:l 为青蛙一次可以 ...
- 压测工具ab的简单使用
apache benchmark(ab)是一种常见的压测工具,不仅可以对apache进行压测,也可以对nginx,tomcat,IIS等进行压测 安装 如果安装了apache,那么ab已经自带了,不需 ...
- PHP mysqli_real_connect() 函数
定义和用法mysqli_real_connect() 函数打开一个到 MySQL 服务器的新连接. mysqli_real_connect() 函数与 mysqli_connect() 函数在以下几个 ...
- 我关了solution并且删掉个sln.DotSettings.user后似乎也可以了
"Go To Definition" is disabled in Visual Studio http://social.msdn.microsoft.com/Forums/en ...
- Codevs 1137 计算系数 2011年NOIP全国联赛提高组
1137 计算系数 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个多项式(ax + by ...
- vueApp打包
本地打包测试 http-server是一个基于node.js的简单的,零配置的命令行http服务器.安装:npm install http-server -g使用:http-server [path] ...
- MySQL认识索引
什么是索引? 索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询 ...
- OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW
Step1:Visual Studio 2017 Why 开发环境,后面编译GLFW 和 GLEW也要用 How 这里使用的是Visual Studio 2017的 Community 版本,直接官网 ...
- 包与类的命名 - service tool util 区别
包与类的命名和定位时,service tool util 常常搞混淆,在此分析一下它们的定位: 名称 特点与定位 独立性 方法和类的属性 util 通用的.与业务无关的,可以独立出来,可供其他项目使用 ...