ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)

0.引言

本文主要讲解RTSP框架和抓取RTSP数据包,进行详细分析。可以阅读以下几篇文章,能够帮助你更详细理解。

手把手搭建RTSP流媒体服务器

HLS实战之Wireshark抓包分析

HTTP实战之Wireshark抓包分析

1.RTSP协议简述

RTSP:Real Time Streaming Protocol是⼀种实时⽹络流传输协议,旨在发送低延迟流。该协议由RealNetworks,Netscape和哥伦⽐亚⼤学的专家在1996年开发。它定义了应如何打包流中的数据以进⾏传输。

其实 TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。

RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断,包括消息类型、消息头、消息体和消息长。但接收者本身可将CR和LF解释成行终止符。基于文本的协议使其以自描述方式增加可选参数更容易,接口中采用SDP作为描述语言。

RTSP是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。

RTSP建立并控制一个或几个时间同步的连续流媒体。尽管连续媒体流与控制流交换是可能的,通常它本身并不发送连续流。换言之,RTSP充当多媒体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP。在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可传输连接以发出RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。

45cedaa1abc457455a67df8895dda33a.png

RTSP协议具有如下特点:

可扩展性:新方法和参数很容易加入RTSP。

易解析:RTSP可由标准HTTP或MIME解析器解析。

安全:RTSP使用网页安全机制。

独立于传输:RTSP可使用不可靠数据报协议(EDP)、可靠数据报协议(RDP);如要实现应用级可靠,可使用可靠流协议。

多服务器支持:每个流可放在不同服务器上,用户端自动与不同服务器建立几个并发控制连接,媒体同步在传输层执行。

记录设备控制:协议可控制记录和回放设备。

流控与会议开始分离:仅要求会议初始化协议提供,或可用来创建惟一会议标识号。特殊情况下,可用SIP或H.323来邀请服务器入会。

适合专业应用:通过SMPTE时标,RTSP支持帧级精度,允许远程数字编辑。

演示描述中立:协议没强加特殊演示或元文件,可传送所用格式类型;然而,演示描述至少必须包括一个RTSP URL。

代理与防火墙友好:协议可由应用和传输层防火墙处理。防火墙需要理解SETUP方法,为UDP媒体流打开一个“缺口”。

HTTP友好:此处,RTSP明智地采用HTTP观念,使现在结构都可重用。结构包括Internet内容选择平台(PICS)。由于在大多数情况下控制连续媒体需要服务器状态,RTSP不仅仅向HTFP添加方法。

适当的服务器控制:如用户启动一个流,必须也可以停止一个流。

传输协调:实际处理连续媒体流前,用户可协调传输方法。

性能协调:如基本特征无效,必须有一些清理机制让用户决定哪种方法没生效。这允许用户提出适合的用户界面。

关于更详细的描述,可以参考如下链接:

https://baike.baidu.com/item/RTSP/1276768?fromtitle=RTSP%E5%8D%8F%E8%AE%AE&fromid=3361755&fr=aladdin

个人觉得RTSP协议相比RTMP协议,更加的复杂。

RTSP协议家族由RTSP部分,RTP部分,RTCP部分,SDP部分组成。RTSP(应用层)也是一个控制命令协议,能够播放、暂停、停止码流。音视频数据不走RTSP协议。RTP是负责音视频的数据发送,RTP(传输层)即可以基于TCP(可能会有点延时,丢包会重传),也可以基于UDP(实时性更好,丢包不会重传)。RTCP(应用层)是对RTP进行控制同步机制。SDP(应用层)是描述多媒体会话,如包含音视频的编解码信息,源地址信息,时间信息等。RTSP整个协议系统如下图:

7e20c7b9ca2e7fe33bfb0df3697242a0.png

注意:这里的RTP实际也是应用层,只是在该协议系统中的位置是传输层。只是所处的位置不一样。

2.RTSP家族协议框架

音视频数据是通过RTP协议传输数据,控制部分主要是由RTCP和RTSP协议部分,其中RTCP与RTP是有一定关系,控制部分的RTSP是基于TCP协议,RTCP与RTP既可以走TCP传输也可以走UDP传输。也就是RTSP协议系统涉及多组传输通道,这与RTMP协议的出入还是很大,RTSP会更加复杂。

22449245701255646d6550af4bd43e83.png

注意:SDP是封装在控制部分的RTSP去传输,并不是单独的。并且RTSP部分和SDP部分,只能基于TCP去传输,切记!

3.推流端使用TCP方式,Wireshark抓取RTSP协议数据包

关于RTSP流媒体服务器环境搭建,可以参考上面一篇文章。手把手搭建RTSP流媒体服务器

通过Wireshark抓包,获取数据和控制协议部分。

(1)首先运行ZLMediakit流媒体服务器

(2)然后开启rtsp推流,拉流。

(3)推流命令,先选择TCP的方式传输。

ffmpeg -re -i source.200kbps.768x320.flv -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://172.16.204.139/live/test

(4)运行Wireshark

注意:网卡一定要选择对,我这里选择如下网卡。

5ab701d858820c6bc3932b127b4ce31e.png

(5)设置过滤器,在窗口输入命令:

rtsp or rtp or rtcp

如下界面:

caadf696b96fba37a4fcc349a2a50f0a.png

(6)通过wireshark抓包工具,可以更清楚的看看这个协议的组成。如下界面;

0078616bde70a17d369255ae377759e3.png

注意:下面看到的OPTIONS、Reply、ANNOUNCE都是信令,

(7)第一个包是通过RTSP协议,客户端发给服务端,数据如下:

9fd9dd50c62b28b029cb86d1d0827873.png

(8)第二个包是通过RTSP协议,服务端发给客户端,数据如下:

7020358b0957677ed74e1b37dd4d0b68.png

(9)第三个包是通过RTSP和SDP协议,客户端发给服务端,数据如下:

c1a0986e644854b4bee06520bde09fc8.png

通过抓包数据可以看到,这里SDP协议专用于传输文本。

e409d385f41e96e327c4d4f46ca74c12.png

注意:这里的RTSP和SDP都是用的统一端口号,默认是554。

(10)第四个包是通过RTSP协议,服务端发给客户端,数据如下:

8983c5182d5c70fad486dcd548d61038.png

(11)第五个包是通过RTSP协议,客户端发给服务端,数据如下:

27427d4b68ecb445c814eac0d1a34232.png

(12)第六个包是通过RTSP协议,服务端发给客户端,数据如下:

484587ea4f58c2b19b9b99b38a02a979.png

(13)第七个包是通过RTSP协议,客户端发给服务端,数据如下:

ef61f324fef6709897ecb432271bcde4.png

(14)第八个包是通过RTSP协议,服务端发给客户端,数据如下:

d2b369f6581ec53d677b614d66d27a81.png

(15)第九个包是通过RTSP协议,客户端发给服务端,数据如下:

18d6d125fd62de91e8291d4aa61d0018.png

(16)第十个包是通过RTSP协议,服务端发给客户端,数据如下:

956d1a778b7a7b31c95318a6250f0436.png

(17)第十一个包是通过RTCP协议,客户端发给服务端,数据如下:

d07774bae550e8d2dd0e6f94ddafde85.png

注意:RTCP协议也是通过端口号554发送。

(18)从第十二个包开始,后面就是一直通过RTP协议发送音视频数据,中间会有RTCP协议从客户端到服务端去发送“Sender Report”。如下界面:

503503c7c95c1f3ce705a9dc41b21941.png

通过查看数据含义可以看出,这里的"96"表示H264,如下:

8f1366936fa0e8a3263adcfe946cd7f1.png

通过查看数据含义可以看出,这里的"97"表示AAC,如下:

8d4cb572f8132b3e8fae272126b80f4c.png

注意:RTP协议发送真正的音视频数据默认也是通过端口号554发送。

(19)当客户端终止推流时,也会向服务器上发送,终止命令"TEARDOWN"。如下界面:

f38cd00b9abafae2a88659ce1518c9e9.png
065be1fadab1029ee09bfb8146bbcd93.png

4.推流端使用udp方式,Wireshark抓取RTSP协议数据包

ffmpeg -re -i source.200kbps.768x320.flv -vcodec h264 -acodec aac -f rtsp -rtsp_transport udp rtsp://172.16.204.139/live/test

注意:下面看到的OPTIONS、Reply、ANNOUNCE、SETUP、RECORD都是信令。

(1)第一个包是通过RTSP协议,客户端发给服务端,数据如下:

这里的RTSP端口号(RTSP协议部分始终是基于tcp),还是使用的554。

a4bc721eff5b51b97206755989ccdb37.png

(2)第二个包是通过RTSP协议,服务端发给客户端,数据如下:

d1cc965cf9656aac8d428d7581857293.png

(3)第三个包是通过RTSP/SDP协议,客户端发给服务端,数据如下:

这里的RTSP/SDP协议还是使用的同一端口号554。

bcf51da112320720cb550bca136bc312.png

发送SDP信息(音视频文本描述信息)很重要,推流客户端会把码流相关的信息告诉服务端,比如这里的SPS信息,这个是很重要的,这样服务端就可以很清楚知道客户端码流的基本信息。如下界面:

8f5e108c59ec358dd4fcc2bf6a41ff18.png

(4)第四个包是通过RTSP协议,服务端发给客户端,数据如下:

8c5205dfdc0a6d154b71aadfe433505f.png

(5)第五个包是通过RTSP/SDP协议,客户端发给服务端,数据如下:

bc6c3cc14b8ffe575536155399fd6d42.png

(6)第六个包是通过RTSP协议,服务端发给客户端,数据如下:

这里服务器回复客户端,设置了视频传输的专用端口号。

63b96fbf42b8b4b9920920d2e3c585d1.png

(7)第七个包是通过RTSP协议,客户端发给服务端,数据如下:

156ac0428d478ee0d47aee241f32b421.png

(8)第八个包是通过RTSP协议,服务端发给客户端,数据如下:

这里服务器回复客户端,设置了音频传输的专用端口号。

5ed32b6e3ff967ac9d2c9a5ae59495e7.png

(9)第九个包是通过RTSP协议,客户端发给服务端,数据如下:

1f0c9600f5fe22c4c6d1cf1e3b8918d8.png

(10)第十个包是通过RTSP协议,服务端发给客户端,数据如下:

从数据来看,回复的是一些流地址信息。

01ab55fc5fbbc06a8f873b7c07a7055c.png

(11)第十一个包是通过RTSP协议,客户端发给服务端,数据如下:

dca0eb0319fff45a31fd20be002434ff.png

(12)从第十一个包以后,就会发送音频和视频数据了,推流端设置的UDP方式,就会影响这里的RTP和RTCP的方式,即通过UDP传输。

8e1c86e2fa3421c3cc9e189fe91529ef.png
ced61b2ee226ec86b3f2d510da8510da.png

(13)这时候可以看到RTCP使用的就是UDP协议传输,端口号使用的是40451。

29d3a379fd6e5498a31af4f217e0dbd5.png

(14)这时候可以看到RTCP使用的就是UDP协议传输,视频传输端口号使用的是40450。

ad290860558c8e39b4d3e88de63687ec.png

(15)这时候可以看到RTCP使用的就是UDP协议传输,音频传输端口号使用的是55034。

f930da748eda11b6bf4fcdaa94addf81.png

(16)这时候可以看到RTCP使用的就是UDP协议传输,在音视频中间传输的还有使用RTCP协议,这里使用的端口号为55035。

410478ab3869d9bee5d460a91890785b.png

(17)客户端首先发送“SETUP”给服务端,服务端回应“Reply”给客户端,并指定了端口号40450,专用于视频传输。

f55249441559d3fabc94c578c3878a28.png

(18)客户端紧接着又发送“SETUP”给服务端,服务端回应“Reply”给客户端,并指定了端口号55034,专用于音频传输。

6e48e5976e05099fc4c10585163f48ca.png

综上所述,在基于udp协议传输的时候,RTP和RTCP通道端口号都是独立。而且RTP对于audio、video也是独立,RTCP对于audio、video也是独立。同时也可以得出,设置的推流基于UDP协议,仅仅是针对RTP和RTCP,不针对RTSP部分,因为RTSP部分依然还是TCP。这是一定要记住的。

使用udp会使用很多端口号,这是与基于TCP协议很大的不同地方。

5.总结

本文重点讲解了RTSP家族协议的组成和框架,并通过抓包更详细的分析了每个协议的数据,能够让大家更清楚的认识RTSP家族协议每个部分的功能。通过设置TCP和UDP两种不同的推流方式,抓取数据包,能够理解推流客户端与服务端之间的数据关系。希望能够帮助到大家。欢迎关注,转发,点赞,收藏,分享,评论区讨论。

后期关于项目的知识,会在微信公众号上更新,如果想要学习项目,可以关注微信公众号“记录世界 from antonio”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xshell 软件的窗口一直是置顶 调整为不置顶

突然感觉xshell 软件的窗口一直是置顶状态,点别的软件窗口点不过去, 搜索一下:微信的 alta是截图,和xshell这个冲突了。如果在xshell下按了这个,不知不觉就被置顶了。。。。。MMP 即这个意思: 如果要修改…

Linux下Vim工具常用命令

原文地址: http://www.cnblogs.com/lizhenghn/p/3675011.html 在linux下做开发,甚至是只做管理维护工作,也少不了Vim的使用。作为一个新手,我也是刚刚接触,本节将我日常使用或收集的Vim常用命令记录下来。 当然&#x…

测试telnet安装成功 以及如何进入和退出telnet命令模式

telnet装好之后,测试。 输入:telnet www.baidu.com 80 出现如图提示是意思是: 正常连通。 然后 按 ctrl ] 进入telnet客户端命令模式,然后用quit退出。进入linux命令模式。

数据按时间拆开分批处理示例

我现在的问题是有一个大的事实表,已经有数十亿条数据,过来的临时表需要merge进去. 临时表的大小也不确定,可能上十亿也可能只有几百几千万而已. 如果直接让这两个表merge起来,则需要很大的内存来进行处理.所以我就想着把数据进行按时间拆分的处理,然后merge进去, 拆分的条件是如…

telnet远程登陆、mstsc远程控制、SSH之间的比较和区别

Telnet与远程桌面mstsc 一 演示 打开mstsc演示: 01 win r 输入mstsc 02 输入要远程的机子的用户名和密码 03 登录 04 连接开启了,如图即是通过win窗口操作远程机子。 以上是使用mstsc打开一个远程连接来通过windows窗口的方式来控制远程机器。 …

Linux查看已经开放的端口,开放端口遇到防火墙的问题。

Linux查看已经开放的端口,开放端口,FirewallD is not running 查看已经开放的端口 firewall-cmd --list-all1 如果出现这种情况说明你的防火墙没有开: 则先把防火墙打开:systemctl start firewalld 扩展内容:. 查看firewalld状…

用yum装程序 报[Errno 12] Timeout on Trying other mirror.

使用yum,报错如图下: 记着之前网卡和dns文件都配置好着的,114.114.114.114都加上的。 检查了下,发现dns文件的配置不见了。。。。 故把 /etc/resolv.conf 中加了如下:然后重点不要重启 service network restart &#…

JavaScript中的原型和继承

请在此暂时忘记之前学到的面向对象的一切知识。这里只需要考虑赛车的情况。是的,就是赛车。 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事。最快的车被称为 Le Mans 原型车。这些车虽然是由“奥迪”或“标致”这些厂商制造的&#xff0c…

Centos7.x 网卡启动报错(Failed to start LSB: Bring up/down networking)

环境:华为云服务器、 CentOS 7.x 操作是 调整网卡配置文件和resolv.conf ,systemctl restart network 重启网络服务总是失败:如下: 按提示看细节: 搜索到还算靠谱的帖子,都说 大多都是网卡配置文件配置错误&#x…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了,挂我啊~ 作者简介: 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW,今年是第一年。。 TCP/IP模型 先做两道题: TCP/IP协议模型由高层到低层分为哪几层: 这题…

J2EE的十三个规范

J2EE想必大家都不陌生吧,貌似现在更流行将其称作JavaEE,不管名字怎么变,核心和思想是没有变的。学习J2EE首先要了解它的规范,下面我们一起看看它的十三个规范。 1,JDBC(Java Database Connectivity&#xf…

Xshell登录Linux服务器 提示WARNING! The remote SSH server rejected X11 forwarding request 及 提示符显示-bash-4.2#

用root登录 Xshell 登录Linux服务器 提示 WARNING! The remote SSH server rejected X11 forwarding request 以及 用户表示符是:-bash-4.2# 而不是user主机名 路径的显示方式。 首先先查 The remote SSH server rejected X11 forwarding request。 解决过程 …

Q我音乐

转载于:https://www.cnblogs.com/lovelife20/p/3709191.html

SRS 启动正常,拉流没画面,看SRS日志报错 srs is already running

日常启动SRS 出错,如下图:像是已有存在的启动。 然后各种停止进程,停止 SRS 服务,日志还是一样的错误提示。 各种查进程或者程序是否存在,并且reboot过了。都不行,折腾一番,没解决问题。最终重…

web开发常用工具介绍

web开发工具介绍: 主要浏览器:IE浏览器、火狐浏览器、谷歌浏览器、Edge浏览器、Safari浏览器、Opera浏览器等。 浏览器市场份额:http://tongji.baidu.com/data/browser 浏览器内核有四种: Trident内核、Gecko内核、WebKit内核、…

CentOS 7安装Development Tools 失败 报错 group tools does not exist. Maybe run: yum groups mark install

重装centos,以及迁移时,碰见这个问题。如下图: CentOS 7安装Development Tools 失败 报错 group tools does not exist. Maybe run: yum groups mark install 报错图示: 一通尝试。最后如下三行解决。 yum groups mark instal…

HTML常用标签、特殊字符、路径

跳转到邮箱&#xff1a; <a href"mailto:someonemicrosoft.com?subjectHello%20again">发送邮件</a><a href"mailto:someonemicrosoft.com?ccsomeoneelsemicrosoft.com&bccandsomeoneelse2microsoft.com&subjectSummer%20Party&bo…

VM Ware 虚拟机centos 时间与本地时间不一致

VM Ware 虚拟机centos 时间与本地时间不一致&#xff0c;如下图。大致是时区设置的问题&#xff0c;设置为中国标准时区即可&#xff0c;CST。 解决办法 1.安装时间同步插件 ntpdate yum install ntpdate 2.启动服务 service ntpdate restart 或 systemctl restart ntpdat…

html中列表、表格、合并单元格

列表&#xff1a; 分为无序列表、有序列表、自定义列表 无序列表&#xff1a; <ul> <!-- ul标签中只能容纳li标签&#xff0c;li标签里面可以容纳其他标签 --><li>列表项1</li><li>列表项2</li><li>列表项3</li>...</ul&…

结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活

写在前面 我到底是什么&#xff1f;越界的可怕做好自己后记上一篇《恋爱虽易&#xff0c;相处不易&#xff1a;当EntityFramework爱上AutoMapper》文章的最后提到&#xff0c;虽然AutoMapper为了EntityFramework做了一些改变&#xff0c;然后就看似幸福的在一起了&#xff0c;但…