前言
网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离。然而,没有实际开发经验的支撑,理论又很难理解到位。
本系列文章将从流媒体协议的基础原理开始,通过抓包分析,并结合具体的代码例程,以[原理]->[抓包]->[代码]相结合的方式,循序渐进由浅入深的介绍rtsp/rtp/rtcp开发相关的内容。
希望通过本系列内容的学习,能让大家快速入门流媒体开发需要掌握的技能。
欢迎大家关注[公众号:断点实验室]流媒体开发系列文章。
rtsp协议开发指南
1、协议架构
先来快速了解一下协议的功能和架构。
RTSP(Real-TimeStream Protocol)协议是一种基于文本的流媒体播放控制协议,位于应用层,它用于建立并控制媒体流数据的传输。
RTP(Real-time Transport Protocol)协议用于音视频码流数据在网络中的传输,它提供端到端的实时传输服务。
RTCP(Real-time Transport Control Protocol)协议是RTP的姐妹协议,主要功能是为RTP协议的服务质量做出反馈。
RTSP与RTP和RTCP协议三位一体,共同完成实时流媒体数据的分发、播放控制及质量监控。
协议架构如下图所示。
在数据传输方面,运载码流的rtp协议,以及质量监控的rtcp协议,一般采用udp方式传输,udp不用建立连接,效率更高,并且在需要时允许直接丢包。
而控制流媒体播放的rtsp协议,则以tcp方式进行数据传输,保证关键报文的无差错送达。
这样安排有一个好处,将通信双方的数据报文与控制报文分成两个独立的网络链路,彼此间互不影响,避免在单一链路下,客户端在接收大的数据帧报文时,阻塞了高优先级的控制报文。
尽管如此,通信双方也可采取将rtsp和rtp/rtcp交织在一起,通过一个网络链路来传输的方式,这种方式称作rtp over rtsp,后续的内容也会为大家介绍这种传输方式。
2、RTSP与RTP和RTCP之间的关系
rtsp对流媒体提供了诸如播放、暂停、快进等像操作本地视频文件一样的控制方法,而它本身并不传输数据。
rtp协议负责媒体流的传输,rtcp主要是为rtp的服务质量做出反馈。
3、RTSP会话流程
一个基本的rtsp会话流程,包括客户端向服务端请求支持的操作类型,发送建立会话请求,请求发送流媒体数据等,会话流程如下图所示。
会话双方通过一系列报文(命令)进行交互,这些报文包括OPTIONS,DESCRIBE,SETUP,PLAY,TEARDOWN等,具体含义如下表所示,其中C标识客户端,S标识服务器。
方向 | 方法 | 描述 | 作用 |
---|---|---|---|
C->S | OPTION request | 询问对端有哪些可用方法 | OPTION用于查询服务器端可用方法 |
S->C | OPTION response | 回应S所有可用方法 | |
C->S | DESCRIBE request | 取得S媒体描述信息 | DESCRIBE用于取得媒体描述信息 |
S->C | DESCRIBE response | 回应媒体描述信息 | |
C->S | SETUP request | 请求建立会话连接 | SETUP用于建立RTSP会话连接 |
S->C | SETUP response | 建立会话连接 | |
C->S | PLAY request | C请求S开始发送数据 | PLAY用于请求开始发送数据 |
S->C | PLAY response | S回应该请求的信息 | |
C->S | TEARDOWN request | 请求关闭会话 | TEARDOWN用于结束RTSP会话 |
S->C | TEARDOWN response | S回应退出请求 |
下面的抓包截图反映了客户端与服务端的实际交互过程。
4、RTSP会话流程仿真
在学习网络协议时,无论什么样协议内容,都建议大家按照从[原理]->[抓包]->[代码]相结合的方式,循序渐进由浅入深的学习。这也是本系列内容遵循的讲述方式。
首先快速理解协议的工作原理和交互方式,然后通过抓包进一步了解协议的帧封装格式等信息,最后通过一到两个代码例程,全面的了解协议的完整实现细节。
大家可以在局域网下搭建一个rtsp推流环境,实际动手体会一下推流的过程,并通过抓包工具分析整个交互流程。最后,再深入研究代码的相关实现,一步步的完善对协议的理解。
4.1 仿真工具准备
仿真需要的工具主要包括wireshark抓包工具以及vlc播放器。
wireshark下载路径:wireshark官网
vlc下载路径:vlc官网
4.2 仿真材料准备
这里推荐两个开源的demo供大家参考,一个Java一个C,Endoscope是android端程序,同时包含客户端与服务端代码,rtsp_demo是linux服务端程序。
demo力求简单有效,希望通过对这些代码的调试分析,能够帮助大家快速取得一些项目经验,加深对协议的理解。
github传送门:Endoscope
github传送门:rtsp_demo
4.3 仿真环境搭建
下面介绍如何在局域网下搭建rtsp推流环境。我们首先对demo进行编译。
Endoscope是android端app程序,直接通过android studio加载编译即可。
Endoscope同时包含了服务端与客户端代码,两个android机在同一个wifi环境下可相互推流。此时推流端作为服务端拉起手机摄像头,将摄像头画面实时发送到另一个手机上显示播放。
此外,也可在pc端通过vlc播放手机推流画面。打开vlc播放器,在[媒体]->[打开网络串流]输入框下,输入手机端的url,如[rtsp://192.168.0.100:8086],即可看到手机摄像头实时画面,此时pc与手机需要在同一wifi环境下。
在pc上用wireshark即可看到会话过程的报文交互。如果还想查看推流端的报文,android端需要用到tcpdump工具,通过tcpdump抓包并保存成wireshark支持的格式,然后将抓包结果导入到pc上用wireshark查看,tcpdump抓包可参考如下命令。
tcpdump -i any -p -vv -s 1500 -n -U -w /sdcard/Download/rtsp.pcap
rtsp_demo是linux服务端程序,需要gcc编译工具链。通过命令行进入工程所在目录,直接输入make命令,即可生成可执行程序,编译不需要额外的依赖库。
以root权限执行demo,打开vlc播放器,输入服务端url如[rtsp://127.0.0.1:8554/live/chn0],即可看到播放画面。
make
sudo ./demo
小结
本篇为流媒体开发系列文章的第一篇,介绍了rtsp协议的架构、功能以及基本的会话流程,并通过仿真实验实际动手搭建了一个局域网下的rtsp推流环境。后面的内容会继续讲述rtsp协议的相关内容,欢迎大家继续关注。
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
// 公众号:断点实验室
// 扫描二维码,关注更多优质原创,内容包括:音视频开发、图像处理、网络、
// Linux,Windows、Android、嵌入式开发等