<RTP协议封装H264/H265/AAC>

<rtsp采用MD5加密摘要认证的交互过程>

目录

一、前言

二、RTSP的信令格式

三、RTSP的通信过程

四、RTSP服务器设计

五、RTSP客户端设计


rtsp实时音视频开发实战课程:

《rtsp 服务端使用TCP/UDP传输音视频代码实现》链接:

https://edu.csdn.net/learn/38258/606138?spm=1003.2001.3001.4157

https://edu.csdn.net/learn/38258/606140?spm=1003.2001.3001.4157

https://edu.csdn.net/learn/38258/606141?spm=1003.2001.3001.4157

《rtsp 客户端使用TCP/UDP接收音视频代码实现》链接:

https://edu.csdn.net/learn/38258/606142?spm=1003.2001.3001.4157

一、前言

RTSP(Real Time Streaming Protocol)实时流协议,是一种网络应用层协议。该协议用于创建和控制终端之间的媒体会话。媒体客户端发布命令,例如播放,关闭,以便于实时控制从服务器到客户端或从客户端到服务器的媒体流。通常RTSP的任务并不包含传输流媒体数据,流媒体数据传输通过RTP(Real-time Transport Protocol)协议和RTCP(Real-time Transport Control Protocol)协议结合来进行流媒体数据传输。RTP协议详细说明了在网络上传递音频和视频的数据如何进行数据包格式的封装。RTCP的主要功能是为RTP所提供的服务质量(Quality of Service)提供反馈,例如:传输字节数,传输分组数,丢失分组数,jitter,单向和双向网络延迟等等,网络应用程序即可利用RTCP的统计信息来控制传输的品质,比如当网络带宽 不足等时候可以降低编码码率来避免网络拥塞,网络带宽多余的时候提升编码码率,来提升音视频的质量。

下图左侧是RTSP程序中RTSP协议和RTP/RTCP协议的关系;在RTSP程序中RTSP协议通过TCP传输双方交互的信令;双方通过信令来确定流媒体传输RTP数据包的方式是UDP还是TCP以及确定传输的端口号;当流媒体传输方式为TCP时候通常只需要按照RTP协议将流媒体数据封装为若干个RTP包,在通过TCP网络发送给对方。当流媒体传输方式为UDP时候需要按照RTP协议将流媒体数据封装为若干个RTP包,在通过UDP网络发送给对方;当网络质量不佳的时候不能保证对方收到RTP包,可能出现丢包、乱序等,所以通常为了保证流媒体数据正常收发,在发送RTP包等时候可以使用RTCP协议来提供服务质量反馈。下图右侧是RTSP协议和RTP/RTCP协议在网络四层模型中所处的位置。RTSP处于应用层,RTP/RTCP通常认为是传输层(也有认为是应用层)。

RTSP 协议标准文档:RFC 2326 - Real Time Streaming Protocol (RTSP)

二、RTSP的信令格式

RTSP通常是服务器客户端模型,就是客户端往服务器发起请求,服务器返回给客户端一个应答消息。接下来我们就介绍下信令请求和应答的格式。下图是信令请求的格式,第一行(首行,也叫Request-Line)包含了方法、URL、版本信息以及空格、回车换行。方法通常包含OPIONS、DESCRIBE、SETUP、PLAY、TEARDOWN等;方法是RTSP为了双方通信过程消息收发的有序性,通常方法的请求/响应需要按照一定顺序,比如PLAY方法请求/响应前需要先进行SETUP的请求/响应。URL里面包含了协议、IP、端口号、路径等。版本信息 通常固定为"RTSP/1.0,表示采用RTSP的1.0版本。CRLF表示回车换行,对应的字符为“\r\n”。第一行数据之后接下来是消息行,通常一个信令包含多个消息行。消息行包含消息头(也叫request-header)、消息值、回车换行。在最后一个消息行之后需要额外添加回车换行,也就说是最后一个消息行的消息值之后需要两个回车换行。消息头常见的有Cseq、Public、Content-Type、Transport、Session等。消息头和消息值之间通过冒号(:)分开。消息值表示消息头具体的内容,如Cseq 取值为0,1,2,3等连续的整数。

下图是信令应答的格式,第一行(首行,也叫Status-Line)包含了版本信息、状态码、状态码描述短语及空格、回车换行。版本信息和请求首行里面的版本信息一致。状态码为返回的状态,如200是返回成功,501表示失败,状态码描述短语通常用于描述状态码的含义,如状态码为200则状态码描述短语为"OK",如状态码为501则状态码描述短语为"Not Implemented"。CRLF表示回车换行,对应的字符为“\r\n”。在第一行数据之后接下来是消息行(也叫response-header),通常一个信令包含多个消息行。消息行包含消息头、消息值、回车换行。在最后一个消息行之后需要额外添加回车换行,也就是最后一个消息行的消息值之后需要两个回车换行。消息头常见的有Cseq、Public、Content-Type、Transport、Session等。消息头和消息值之间通过冒号(:)分开。消息值表示消息头具体的内容,如Cseq 取值为0,1,2,3等整数。实体主体通常在返回SDP信息的时候会出现。

RTSP中定义的状态码如下图所示。在需要用户名和密码的RTSP中如果用户名密码错误通常返回401的状态码。

消息头的定义以及使用如下图所示;methods表示当前消息头是否需要出现在当前方法请求/应答信令消息中。如在SETUP方法的请求和应答都需要Transport这个消息头。

RTSP中常见消息头的的描述/作用如下表所示。

消息头 描述
CSeq 方法请求序列;值是一个递增数值,必须出现在所有请求中,应答则返回相同的值。在不同的方法中该数值不同。
Public 通常用于应答,表示支持的方法有哪些
Content-Type 是HTTP协议里面定义的内容类型,比如RTSP 会请求application/sdp的数据
Content-Length Content-Type指定类型数据的长度。
Accept 用于请求指定流媒体的描述性内容,比如application/sdp
User-Agent 是一个特殊字符串头,使得服务器能够识别客户使用的操系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言等
Session 8位数以上的会话ID
Transport 约定的传输协议类型(TCP/UDP)、端口号,广播模式(点播/单播、多播等)
Server 服务端的标识名称、版本等字符串信息
WWW-Authenticate 身份认证,包含用户名、认证方式、摘要信息等

三、RTSP的通信过程

在RTSP 客户端请求RTSP服务器的情况下,通常是客户端按照一个方法往客户端发起请求(C->S),服务器收到对应方法回给予客户端应答(S->C)。RTSP中的常用方法如下表所示。

方法 请求方向 描述
OPTIONS C->S/S->C (通常户端向服务器发送)向对方请求/查询对方可以用的方法
DESCRIBE C->S 请求/查询对方的多媒体描述信息,通常会返回SDP信息。
SETUP C->S 请求用于流媒体的传输机制,如使用TCP/UDP传输RTP,端口号等信息
PLAY C->S 告诉服务器以SETUP指定的机制开始发送RTP数据
TEARDOWN C->S TEARDOWN请求停止给定URL流发送,释放相关资源,通常用于关闭RTSP
SET_PARAMETER C->S/S->C 请求设置URL指定流的参数值
GET_PARAMETER C->S/S->C 请求检查URL指定的流媒体的参数值

下图是RTSP 客户端(Client)和服务端(Server)的交互过程蓝色是客户端的数据发送,绿色是服务端的数据发送(作为对客户端的响应),橙色是RTP数据的发送。

OPTIONS交互信令如下:

客户端往服务器发送请求;

OPTIONS rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)

服务器给客户端返回可以使用的方法,如 DESCRIBE, SETUP, TEARDOWN, PLAY等方法;服务器可用的方法在Public字段中。

RTSP/1.0 200 OK
CSeq: 2
Public: DESCRIBE, SETUP, TEARDOWN, PLAY

DESCRIBE交互信令如下:

客户端往服务器发送请求;

DESCRIBE rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

服务器给客户端返回SDP信息;下面SDP信息"m=video 0 RTP/AVP 96"包含了视频RTP封装中对应的载荷类型值为96,"a=rtpmap:96 H264/90000"表示视频编码为H264视频为90000HZ。"m=audio 0 RTP/AVP 97"表示音频在RTP中的载荷类型值为97;"a=rtpmap:97 mpeg4-generic/32000/2"表示音频编码是AAC,采样率32000,双声道。

RTSP/1.0 200 OK
CSeq: 3
Date: Sat Dec  3 15:25:30 2022
Transport: RTP/AVP
Accept: application/sdp
Server: rtspServer
Content-Type: application/sdp
Content-Length: 471v=0
o=- 0 0 IN IP4 0.0.0.0
s=h265+aac
t=0 0
a=control:rtsp://127.0.0.1:554/live/chn0
a=range:npt=0-
m=video 0 RTP/AVP 98
c=IN IP4 0.0.0.0
a=rtpmap:98 H265/90000
a=control:rtsp://127.0.0.1:554/live/chn0/track1
m=audio 0 RTP/AVP 97
c=IN IP4 0.0.0.0
a=rtpmap:97 mpeg4-generic/44100/2
a=fmtp:97 streamtype=5;profile-level-id=1;sizeLength=13;IndexLength=3;indexDeltaLength=3;mode=AAC-hbr;config=2210;
a=control:rtsp://127.0.0.1:554/live/chn0/track2

SETUP交互信令如下:

客户端往服务器发送请求;客户端通过Transport自动信息告诉服务器,通过UDP(RTP/AVP)的方式传递流媒体(RTP封包后)的数据,采用单播方式(unicast),client_port约定的是客户端RTP和RTCP数据的端口号,通常RTP的端口为偶数,RTCP的端口号为RTP的端口加1,端口号范围通常为1024 - 65535。

SETUP rtsp://127.0.0.1:554/live/chn0/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=63732-63733

服务器给客户端返回信息;server_port是服务器的RTP/RTCP的端口号;ssrc是RTP封装包过程的ssrc值。Session字段是当前会话ID。

RTSP/1.0 200 OK
CSeq: 4
Date: Sat Dec  3 14:22:42 2022
session: 305419896
Transport: RTP/AVP;ssrc=22345678;unicast;client_port=63734-63735;server_port=49154-49155
Server: rtspServer

PLAY交互信令如下:

客户端往服务器发送请求;Range字段包含了播放流的范围比如网络时间协议(npt)0s时间开始到100s结束;如果是实时流通常配置0-,表示播放流表不会自动停止,下面的“Range: npt=0.000-”通常用于实时直播流的播放。

PLAY rtsp://127.0.0.15:554/live/chn0 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 305419896
Range: npt=0.000-

服务器给客户端返回信息;

RTSP/1.0 200 OK
CSeq: 5
Date: Sat Dec  3 14:22:42 2022
session: 810817929
Server: rtspServer

TEARDOWN交互信令如下:

客户端往服务器发送请求;客户端通过Session告诉服务器应该关闭哪个RTSP会话。

TEARDOWN rtsp://127.0.0.1:554/live/chn0 RTSP/1.0
CSeq: 6
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 305419896

服务器给客户端返回信息;

RTSP/1.0 200 OK
CSeq: 6

四、RTSP服务器设计

单播实时模式下的RTSP 服务端的设计框图如下(RTP的传输没有RTCP)。在启动RTSP Server过程先配置网络(socket的创建、等待连接等);然后分别创建RTSP Server Task和RTSP Transport Task。

RTSP Server Task用于连接新的客户端并完成信令交互。当新的客户端连接进来会加入到客户端连接List中,然后解析客户端发来的信令消息;若客户端的信令消息有错或者客户端发了TEARDOWN 的方法则将该客户端从客户端连接List中移除。 RTSP Server Task在信令交互过程会确认RTP传输的方式、端口号等参数。

RTSP Transport Task 用于RTP封包并将RTP包发送给连接进来的每一个客户端。当客户端发送PLAY方法则将该客户端加入到RTP传输List中;打包完成RTP数据后从RTP传输List中遍历客户端,并根据RTP传输方式(UDP/TCP)来传输RTP数据包。

五、RTSP客户端设计

单播实时模式下的RTSP客户端的设计框图如下(RTP的传输没有RTCP)。在启动RTSP 客户端过程先配置网络(socket的创建、连接等);然后分别创建RTSP Client Task和RTSP Recv Task。

RTSP Client Task 用于和服务建立连接信令交互。在RTSP Client Task中会告知服务器发送RTP包的方式是UDP还是TCP,以及RTP的端口号。

RTSP RecvTask用于接收RTP包并将RTP包解封装,生成原始的H264/265、AAC编码数据,并将原始的H264/265、AAC编码数据存储到缓存队列中。

SDP(Session Description Protocol)相关资料:RFC 2327: SDP: Session Description Protocol;RTP协议相关资料:RFC 3550: RTP: A Transport Protocol for Real-Time Applications

RTSP服务器代码实现请参考 <rtsp服务器实现课程>

RTSP客户端代码实现请参考 <rtsp客户端实现课程>

RTSP实时音视频传输介绍相关推荐

  1. QOS FEC NACK 实时音视频传输库测试报告(声网、腾讯实时音视频测试)

                        目录 QOS-FEC-NACK传输库简介 实验环境 测试DEMO说明 测试项说明 测试结果 竞品分析 总结                     QOS FE ...

  2. IoT 设备高质量的实时音视频传输解决方案

    12月10日,实时互动云服务开创者及引领者声网Agora在北京举办了媒体沟通会,发布了首款定义轻互动直播场景的"极速直播"与可降低50%直播带宽成本的"低码高清" ...

  3. Android设备实时音视频传输有效方案

    /   今日科技快讯   / 6月2日晚上8点,鸿蒙线上发布会在万众瞩目中准时开始.华为正式发布了HarmonyOS 2(以下简称鸿蒙系统),以及多款新的硬件产品,包括HUAWEI Mate 40系列 ...

  4. 树莓派+android things+实时音视频传输demo之遥控小车

    做了个测试小车,上面安装了摄像头,通过外网进行视频传输: https://www.bilibili.com/video/av23817880/ 转载于:https://www.cnblogs.com/ ...

  5. 有的放矢,远程操控中实时音视频的优化之道

    5G远程操控场景,对实时音视频传输的时延.卡顿率和抗弱网等指标都有着非常高的要求,本文将会介绍如何结合5G网络特点,在实时音视频通信链路中进行联合优化,满足行业场景远控需求,降低画面时延. 在上一篇文 ...

  6. 干货 | BBR及其在实时音视频领域的应用

    实时音视频系统要求低延时,流畅性好,而实际网络状态却是复杂多变的,丢包,延时和网络带宽都在时刻变化,这就对网络拥塞控制算法提出了很高的要求.本文来自网易云信资深工程师肖磊在LiveVideoStack ...

  7. 网易云信亮相LiveVideoStackCon 2019,分享BBR在实时音视频领域的应用

    8月23日,LiveVideoStackCon音视频技术大会在北京隆重举办.本届会议以"多媒体技术赋能新世界"为主题,聚焦音频.视频.图像.AI等技术的最新探索与应用实践.大会汇集 ...

  8. BBR及其在实时音视频领域的应用

    实时音视频系统要求低延时,流畅性好,而实际网络状态却是复杂多变的,丢包,延时和网络带宽都在时刻变化,这就对网络拥塞控制算法提出了很高的要求.本文来自网易云信资深工程师肖磊在LiveVideoStack ...

  9. RTC 系统音视频传输弱网对抗技术

    Hi~这里是25万+社交,泛娱乐,出海开发者青睐的全球互联网通信云·融云若你对国产化,协同办公解决方案感兴趣,欢迎关注本号的[兄弟号]关注[融云 RongCloud],了解协同办公平台更多干货. 今天 ...

最新文章

  1. 复习计算机网络基础 day7--网络层
  2. linux内核层功能 和核心,Linux内核研发工程师
  3. ege函数库_EGE图形库|EGE图形库下载v12.11 最新版 附使用教程 - 欧普软件下载
  4. ttlsa教程系列之MySQL---MySQL/Galera集群-多主高可用性负载均衡
  5. python函数不定参数求和
  6. 四十五、Stata检验方法,回归分析与生存分析
  7. 满足条件的两个数或多个数
  8. html5 摆动的花朵,CSS3实现一个旋转的花朵
  9. 55_pytorch,自定义数据集
  10. python笔记第二天
  11. java list 获取索引_java – 获取arrayList中元素的索引
  12. php7.0康乐安装_Windows服务器安装配置PHP7.0环境图文教程
  13. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS
  14. php curl使用详解
  15. Python 将时间戳转换为本地时间并进行格式化
  16. 构建最基础的Spring项目及所需要的jar包
  17. 如何判断一个算式是几位运算
  18. 生物信息学Bioinformatics学习笔记(一)
  19. 程序员面试题分享,掌握八成便可BAT一试!
  20. 很全的HTML5功能概述,温故而知新,可以为师矣!

热门文章

  1. 分享几个去图片水印好用的软件给你
  2. php后端aes加密前端解密
  3. android调用相机分辨率,Android菜鸟笔记-获取摄像头像素值
  4. SQLStudio下载
  5. Intel 万兆网卡调研 X520 X540 X550 X710 X810 对比 10GB/40GB/100GB NIC
  6. 如何用数据找到下一家独角兽?
  7. echarts世界地图中的国家名称显示中文
  8. 5.基于Abp的DDD框架
  9. DD-路径图、MM-路径图的定义与区别联系
  10. 阿里云ecs服务器(Ubuntu)配置图形界面并远程桌面连接