前言

网上关于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播放器实现详解 - 快进快退控制


// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

rtsp协议开发指南相关推荐

  1. rtsp协议格式解析

    前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...

  2. rtsp协议报文解析-首部字段解析

    前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...

  3. Miracast开发4——-应用层rtsp协议

    Mircacast协议介绍---------应用层rtsp协议 前面说到 Miracast协议框架,以及重点讲了发现的过程,物理层链接链接的过程,IP分配的过程,如果获取对端IP等等.下面我们来讲讲, ...

  4. Netty权威指南之Websocket协议开发

    本章主要学习内容如下: 1.HTTP协议弊端 2.WebSocket入门 3.Netty WebSocket协议开发 第一节:HTTP协议弊端 将HTTP协议的主要弊端总结如下: 1.HTTP协议为半 ...

  5. 开发 Wasm 协议插件指南

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本文主要详细介绍如何基于 wasm go sdk 实现协 ...

  6. 基于Asterisk的VoIP开发指南…

    原文地址:基于Asterisk的VoIP开发指南--(1)实现基本呼叫功能作者:晓晓 说明: 本文档探讨基于Asterisk如何实现VoIP的一些基本功能,包括基本呼叫功能的方案选取.主叫号码透传.如 ...

  7. RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道

    目录标题 引言 RTSP协议基础 RTSP协议的组成与工作原理 RTSP协议的组成 RTSP协议的工作原理 RTSP协议与其他流媒体协议的比较 RTSP协议的基本功能与用途 RTSP协议详解 RTSP ...

  8. 《智能路由器开发指南》——1.1 OpenWrt简介

    本节书摘来异步社区<智能路由器开发指南>一书中的第1章,第1.1节,作者:张永智 ,李章明,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.1 OpenWrt简 ...

  9. rtsp协议_如何在RTSP协议视频智能平台EasyNVR未登录的情况下调用通道直播的接口?...

    原标题:如何在RTSP协议视频智能平台EasyNVR未登录的情况下调用通道直播的接口? TSINGSEE青犀视频云边端架构全线都提供了丰富的API接口,用户可以自由调用进行二次开发.在本文之前,我们博 ...

最新文章

  1. 关于Scala递归返回参数的问题
  2. ssh协议是tcp还是udp_DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?
  3. scikit_learn中fit()/transform()/fit_transform()区别和联系
  4. Nginx不停机优雅升级
  5. 倩女幽魂7月20日服务器维护,倩女幽魂手游7月20日更新什么?倩女幽魂手游7月20日更新一览...
  6. vm的红帽linux怎样安装教程,vmware10怎么安装linux_redhat7系统安装教程
  7. 微信小程序|开发实战篇之五-slide-view滑动菜单组件
  8. 安卓应用安全指南 4.1.2 创建/使用活动 规则书
  9. vmware提示虚拟机似乎正在使用中
  10. 跨线程调用UpdateData函数导致Asset
  11. css免费网站,5个免费网站模板|免费CSS模板网站汇总
  12. msvcr71.dll 等相关DLL文件类型缺失下载
  13. 16位华人获“诺奖风向标”斯隆奖,4人来自北大数院
  14. 手写vue3源码——reactive, effect ,scheduler, stop 等
  15. 微信中各种代码/符号合集
  16. 听书类APP消息功能竞品分析
  17. php array_sli ce,JavaScript Array --map()、filter()、reduce()、forEach()函数的使用
  18. 小学生都看得懂的C语言入门(1): 基础/判别/循环
  19. android 心跳包的分析
  20. 小飞升值记——(21)

热门文章

  1. 【169期】面试官:同学,分析一下MySQL/InnoDB的加锁过程吧
  2. 无线路由器穿墙能力浅析
  3. 在职阿里6年,一个29岁女软件测试工程师的心声
  4. Navicat for MySQL 导出 Excel 时身份证号惨遭科学计数
  5. react插入html
  6. div+mui+vue.js 制作问卷调查单页 ——题目答案是造的json
  7. 研发云应用软件:差异何在
  8. 计算机网络发展(简述)
  9. DoS及攻击方法详解
  10. 你心目中的企业应用开发框架该怎样构建?