rtsp协议开发指南

前言

网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离。然而,没有实际开发经验的支撑,理论又很难理解到位。

本系列文章将从流媒体协议的基础原理开始,通过抓包分析,并结合具体的代码例程,以[原理]->[抓包]->[代码]相结合的方式,循序渐进由浅入深的介绍rtsp/rtp/rtcp开发相关的内容。

希望通过本系列内容的学习,能让大家快速入门流媒体开发需要掌握的技能。

欢迎大家关注[公众号:断点实验室]流媒体开发系列文章。
rtsp协议开发指南
rtsp协议格式解析
rtsp协议报文解析-请求行解析
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协议的相关内容,欢迎大家继续关注。

往期推荐

ffmpeg播放器实现详解 - FFmpeg编译安装
ffmpeg播放器实现详解 - FFPlay源码编译
ffmpeg播放器实现详解 - 框架搭建
ffmpeg播放器实现详解 - 视频显示
ffmpeg播放器实现详解 - 音频播放
ffmpeg播放器实现详解 - 创建线程
ffmpeg播放器实现详解 - 视频同步控制
ffmpeg播放器实现详解 - 音频同步控制
ffmpeg播放器实现详解 - 快进快退控制


// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
// 公众号:断点实验室
// 扫描二维码,关注更多优质原创,内容包括:音视频开发、图像处理、网络、
// Linux,Windows、Android、嵌入式开发等

posted @ 2022-01-20 21:25  断点实验室  阅读(674)  评论(0编辑  收藏  举报