海康RTSP客户端连接深入分析

2023-11-05

海康相机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 OKRTSP
【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\n

Date:  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的时候,服务器也会用这一套公式去计算,当发现计算出的值与客户端提供的值吻合的时候,则表明用户名和密码校验成功

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)=fa47d934c754db5ebebd9b42a4412073
	sprintf_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) =0b0a4e77e852876bdfdf6ecb72ba3900
	sprintf_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)=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:5000
Media Attribute (a): control:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=1
Media Attribute (a): rtpmap:96 H264/90000
Media 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:50
Media Attribute (a): control:rtsp://192.168.1.145:554/MPEG-4/ch2/main/av_stream/trackID=2
Media Attribute (a): rtpmap:0 PCMU/8000
Media 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\n
CSeq: 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/TCP

RAW UDP传输:Transport:RAW/RAW/UDP

****************************************************************************************

【S4-REPLY】

Response: RTSP/1.0 200 OK\r\n
CSeq: 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\n
CSeq: 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\n
CSeq: 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\n
CSeq: 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\n
CSeq: 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\n
Method: 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\n
Status: 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

海康RTSP客户端连接深入分析 的相关文章

  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • gcc编译时 warning:incompatible implicit declaration of built-in function ‘xxx’

    报错是因为我们没有添加该函数所在头文件 可通过man xxx来查询xxx函数所在的头文件 添加后即可
  • leetcode712. 两个字符串的最小ASCII删除和(最短非公共子序列)

    传送门 题目 给定两个字符串s1 s2 找到使两个字符串相等所需删除字符的ASCII值的最小和 输入 s1 sea s2 eat 输出 231 解释 在 sea 中删除 s 并将 s 的值 115 加入总和 在 eat 中删除 t 并将 1
  • 流利说 Level 5 全文

    Level 5 Unit 1 1 4 Listening Lesson 1 Jessica s Class Reunion1 2 Vocabulary Lesson 3 Actions and Change Lesson 4 Types o
  • Qt C++中的关键字explicit

    最近在复习QT 准备做项目了 QT Creator 默认生成的代码 explicit Dialog QWidget parent 0 中 有这么一个关键字explicit 用来修饰构造函数 以前在Windows下写程序的时候 基本上没有碰到
  • 【PHP】【组件使用】【phpexcel】【phpexcel导入导出】

    PHP 组件使用 phpexcel phpexcel导入导出 一 前提 PHP 7 3 tp3 2 tp5版本及以上的可能需要修改 二 phpexcel包引入 composer require phpoffice phpexcel 三 复用
  • pscp --windows上下载远程SSH服务器实用工具

    1 下载pscp exe pscp exe 工具下载地址 下载完后 复制粘贴到C Windows System32目录下 以便我们来调用 或者将下载文件的路径添加到系统环境变量中 2 pscp工具使用 1 上传本地文件到SSH服务器 将本地
  • 2019年个人总结

    今天是今年的最后 一天 写个个人总结 对自己一年来的工作进行总结 通过分析和研究进而肯定成绩并找出问题 得出经验和教训 2019年自己的前端方面 移动端 完成了好艺的app项目 协会的微官网 好艺的app转为公众号 学生开学统计项目等 其中
  • Python10个与数学有关的简单实例代码

    注意 我用的python2 7 大家如果用Python3 0以上的版本 请记得在print 函数哦 如果因为版本问题评论的 不做回复哦 1 题目 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 程序分析 可填在百
  • Javascript之BOM与DOM讲解

    文章转载自 https blog csdn net qq877507054 article details 51395830 一 Javascript组成 JavaScript的实现包括以下3个部分 ECMAScript 核心 描述了JS的
  • 项目开发中常用的十六进制方式打印实现

    在项目开发中 比如网络开发 多媒体播放开发等 常常用到将接受数据和发送数据或者需要解析的数据 用打印方式呈现 方便自己定位问题 在这个时候 printf难免没有满足我们的需要了 因为printf bufdata s n bufdata 是用
  • keil Error: Could not load file解决方法

    1 你点完建造文件 然后进行调试 不会出错 2 不要点编译文件 编译后文件调试状态关闭了 再调试 这样就会出这个错误
  • js-基础知识(一)

    1 在html中引入js的两种方法 1 页面内嵌 2 外部引入 为符合web标准 w3c标准中的一项 结构 样式 行为相分离 通常会采用外部引入
  • mmsegment数据pipeline操作(七)

    目录 1 数据项配置 2 voc数据集传入参数 3 CustomDataset数据读取 4 self pipeline results 4 1 读图 4 2 数据增广 4 3 格式转换 4 4 测试 5 扩展和使用自定义管道 1 数据项配置
  • 计算机专业留学动机信范文,出国留学,如何写好动机信(Motivation Letter)?

    一篇好的动机信最重要的是简洁易懂 用最简洁的语言展示申请者最突出的优点 浙大毕业后在美国 UIUC 和欧洲 KTH CTH EPFL NTNU 留学 PhD 另外由于在之前的工作中也参与系里招生 帮老板评审申请材料 参与系里招生会议 经手的
  • 数据结构之线性表预习

    1 简述线性表中顺序存储结构的含义及主要元素 描述顺序存储结构需要三个属性 1 存储空间的起始位置 数组 data 它的存储位置就是存储空间的存储位置 2 线性表的最大存储容量 3 线性表的当前长度 数组长度 与 线性表长度区别 数组长度
  • 编程新手导论

    第二部分 导论 这一部分主要是关于编程的导论 要懂得一点思想具备一点常识 设计 编码 与软工 编程与思想 这一章解释了三种思想 原语 抽象 组合 和软件开发的二个重要过程 软件工程的相关概念 是编程入门的关键 要懂得一点领域内的数学 数学与
  • python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结

    在处理图像的时候经常是读取图片以后把图片转换为灰度图 作为一个刚入坑的小白 我在这篇博客记录了四种处理的方法 首先导入包 import numpy as np import cv2 import tensorflow as tf from
  • 【网络】IP协议相关的技术(DNS、ARP、ICMP、DHCP)简析

    1 DNS 域名解析协议 TCP IP中使用IP地址和端口号来确定网络上的一台主机的一个程序 但是IP地址不方便记忆 于是人们发明了一种叫主机名的东西 是一个字符串 并且使用hosts文件来描述主机名和IP地址的关系 DNS协议是将域名转换
  • COCO和VOC数据集的转换:VOC2COCO和COCO2VOC

    VOC2COCO 方法一 参考自博客 数据格式的转换实际是将VOC的annotation标注文件转化为COCO的json文件 注 下面代码包含通过txt文件生成和通过文件夹生成两种方法 1 通过txt文件生成 按照VOC数据集下ImageS
  • 海康RTSP客户端连接深入分析

    海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作 现在介绍一下分析过程和源码 源码在我上传的共享资料中 http download csdn net detail zhouyongku 8203521 一 基本原理