RTP协议--介绍

news2024/11/26 16:49:48

一、什么是RTP

数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷。

二、RTP的会话过程

当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。 RTP的发送过程如下,接收过程则相反。

1)RTP协议从上层接收流媒体信息码流(如H.263),封装成RTP数据包;

2)RTCP从上层接收控制信息,封装成RTCP控制包。

2)RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。

三、RTP Header解析

前12字节是固定的,CSRC可以有多个或者0个。

1)V:RTP协议的版本号,占2位,当前协议版本号为2

2)P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分

3)X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头

4)CC:CSRC计数器,占4位,指示CSRC标识符个数

5)M:标志,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。

6)PT(payload type):有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流,这样便于客户端进行解析。

7)序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。这个字段当下层的承载协议用UDP的时候,网络状况不好的时候可以用来检查丢包。当出现网络抖动的情况可以用来对数据进行重新排序。序列号的初始值是随机的,同时音频包和视频包的sequence是分别计数的。

8)时戳(Timestamp):占32位,必须使用90kHZ时钟频率(程序中的90000)。时戳反映了该RTP报文的第一个八位组的采样时刻。接受者使用时戳来计算延迟和延迟抖动,并进行同步控制。可以根据RTP包的时间戳来获得数据包的时序。

9)同步信源(SSRC)标识符:占32位,用于标识同步信源。同步信源是指产生媒体流的信源,他通过RTP报头中的一个32为数字SSRC标识符来标识,而不依赖网络地址,接收者将根据SSRC标识符来区分不同的信源,进行RTP报文的分组。

10)提供信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个CSRC。每个CSRC标识了包含在RTP报文有效载荷中的所有提供信源。

音视频资料领取见文末名片

 

提供信源用来标识对一个RTP混合器产生的新包有贡献的所有RTP包的源。是指当混合器接收到一个或多个同步信源的RTP报文后,经过混合处理产生一个新的组合RTP报文,并把混合器作为组合RTP报文的SSRC,将原来所有的SSRC都作为CSRC传送给接收者,是接受者知道组成组合报文的各个SSRC。

把前两字节 80 e0 换成二进制如下

1000 0000 1110 0000

按顺序解释如下:

10 是V;

0 是P;

0 是X;

0000 是CC;

1 是M;

110 0000 是PT;

四、RTP载荷H264码流:红色RTP协议头,黄色H264码流

RTP头后是RTP载荷,RTP载荷第一个字节格式跟NALU头一样:

F和NRI也跟NALU头一样,只有Type有些不一样:拓展24 – 31

0 没有定义

1-23 NAL单元 单个 NAL 单元包.

24 STAP-A 单一时间的组合包

25 STAP-B 单一时间的组合包

26 MTAP16 多个时间的组合包

27 MTAP24 多个时间的组合包

28 FU-A 分片的单元

29 FU-B 分片的单元

30-31 没有定义

1) 单个NAL单元包:荷载中只包含一个NAL单元。NAL头类型域等于原始 NAL单元(NALU)类型,即Type在范围1到23之间。

2)组合包:本类型用于聚合多个NAL单元到单个RTP荷载中。本包有四种版本,单时间聚合包类型A(STAP-A)单时间聚合包类型B(STAP-B),多时间聚合包类型(MTAP)16位位移(MTAP16),多时间聚合包类型(MTAP)24位位移(MTAP24)。赋予STAP-A,STAP-B,MTAP16,MTAP24的NAL单元类型号(Type)分别是24 25 26 27

3)分片包:用于分片单个NAL单元到多个RTP包。现存两个版本FU-A,FU-B,用NAL单元类型(Type)28 29标识

常用的打包时的分包规则:如果小于MTU采用单个NAL单元包,如果大于MTU就采用FUs分片方式

五、单个NAL单元包格式

对于NALU(NAL单元)的长度小于MTU大小的包,一般采用单一NAL单元模式

定义在此的NAL单元包必须只包含一个。RTP序号必须符合NAL单元的解码顺序。这种情况下,NAL单元的第一字节和RTP荷载头第一个字节重合。如上图所示。

对于一个原始H264的NALU单元常由[start code] [NALU Header] [NALU Payload]三部分组成,其中start code用于标识这是一个NALU单元的开始,必须是“00 00 00 01”或“00 00 01”,NALU头仅一个字节,其后都是NALU单元载荷。

打包时去除“00 00 01”或“00 00 00 01”的开始码,把其他数据封装成RTP包即可。

如有一个 H.264 的 NALU 是这样的:

[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

这是一个序列参数集 NAL 单元。 [00 00 00 01] 是四个字节的开始码, 67 是 NALU 头, 42 开始的数据是 NALU 载荷.

封装成 RTP 包将如下:

[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ... ]

即只要去掉 4 个字节的开始码就可以了.

六、组合封包格式

当NALU的长度特别小时,可以把几个NALU单元封在一个RTP包中

七、分片单元(FU-A)

当NALU的长度超过MTU时,就必须对NALU单元进行分片封包,也称为Fragmentation Units (FUs)NAL单元的一个分片由整数个连续NAL单元字节组成。每个NAL单元字节必须正好是该NAL单元一个分片的一部分。

作者:指 纹

★文末名片可以免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

相关文章

js多边形算法:多边形缩放、获取中心、获取重心/质心、判断是否在多边形内、判断点排序是否顺时针等

一、前言 最近做多边形相关的工作,涉及比较多相关算法,总结一下,方便大家,如果帮到您,记得点赞! 二、演示 【在线演示】 【源码gitee】 三、使用 所有核心算法都在utils.js里面,含参数说明…

扩散模型代码剖析

前言 相信大家对扩散模型早有耳闻,其着实大火了一把,效果也确实是好。今天写这篇博客的主要动机就是想真正进入到代码层面去看看其到底是怎么实现的。 其实在看完代码后,会觉得其实现的非常简单,而且也会对原理的理解有一个更好的…

如何快速构建企业级数据湖仓?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 本文整理自火山引擎开发者社区技术大讲堂第四期演讲,主要介绍了数据湖仓开源趋势、火山引擎 EMR 的架构及特点,以及如何基于火山引擎 EMR 构…

Python+Yolov5人脸口罩识别

程序示例精选 PythonYolov5人脸口罩识别 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 Yolov5比较Yolov4,Yolov3等其他识别框架,速度快,代码结构简单,识别效率高&#xf…

【王道计算机网络笔记】网络层-网络层协议

文章目录地址解析协议ARP动态主机配置协议DHCP国际控制报文协议ICMPICMP差错报文ICMP询问报文ICMP的应用地址解析协议ARP 由于在实际网络的链路上传送数据帧时,最终必须使用MAC地址 ARP协议:完成主机或路由器IP地址到MAC地址的映射。解决下一跳走哪的问…

Metal每日分享,海报画滤镜效果

本案例的目的是理解如何用Metal实现海报画效果滤镜,主要就是改变颜色级别数量从而获取到新的像素颜色; Demo HarbethDemo地址 实操代码 // 海报画滤镜 let filter C7Posterize.init(colorLevels: 2.3)// 方案1: ImageView.image try? BoxxIO(eleme…

不用虚拟机也能在Windows下使用Linux

想学习热门的Linux系统,可是一开始就需要安装虚拟机软件,这样很容易消耗Linux初学者的热情。比如常用的VMWare虚拟机,虽然步骤并不复杂,但是一开始的搭建和配置过程, 容易劝退一部分新手。我认为学习新的操作系统&…

看了这篇文章后,面试官再也不敢问你非结构化存储的原理了

那么你可能会说,是不是我无限制地增加从库的数量就可以抵抗大量的并发呢? 实际上并不是的。因为随着从库数量增加,从库连接上来的 IO 线程比较多,主库也需要创建同样多的 log dump 线程来处理复制的请求,对于主库资源消…

[附源码]Python计算机毕业设计飞羽羽毛球馆管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

人工智能课后作业_python实现深度优先遍历搜索(DFS算法)(附源码)

1 深度优先遍历搜索(DFS) 1.1算法介绍1.2实验代码1.3实验结果1.4实验总结 1.1算法介绍 深度优先搜索算法(Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点…

知识图谱-KGE-第三方库:OpenKE库【清华开源】

GitHub - thunlp/OpenKE: An Open-Source Package for Knowledge Embedding (KE) OpenKE是THUNLP基于TensorFlow、PyTorch开发的用于将知识图谱嵌入到低维连续向量空间进行表示的开源框架。在OpenKE中,我们提供了快速且稳定的各类接口,也实现了诸多经典…

生态流量智能终端机介绍 功能 特点

平升电子生态流量智能终端机是一款集人机交互、视频叠加、4G路由、数据采集、逻辑运算与远程传输功能于一体的多媒体智能终端设备。 此款产品为水电站生态流量监测项目的专用产品,便于监管单位及时掌握水电站的流量下泄情况,以保障河湖生态用水&#xf…

Java序列化_unknown object tag -126

项目场景: 第一次进入获取员工信息的方法时,会先通过序列化数据库的对应员工信息并保存到 Redis 中。 第二次进入获取员工信息的方法时,直接取出 Redis 里序列化后员工信息,进行反序列化后返回。 问题描述 这里是第一次保存成功…

重温经典,推箱子游戏,你能闯到第几关?可自行添加关卡

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

WebDAV之葫芦儿·派盘+厚墨

厚墨 支持WebDAV方式连接葫芦儿派盘。 如果你喜欢看电子书又时常书荒,搜索不到想要的电子书,那就快来试试厚墨阅读APP吧。与你一同搜索极简阅读中的最佳体验。 厚墨是目前网络上非常方便的一款电子阅读软件,采用独家数据采集分析技术,汇合了移动互联网各种资源网站大数据…

【JavaSE成神之路】可变参数

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java的可变参数。 1.什么是可变参数 首先来看下概念。 Java的可变参数指的是在方法中设置不定数量的参数。可变参数使得代码更加简洁&#x…

用cocos creator实现《我的世界》

摘要 《我的世界》是一款非常流行的游戏,不过网上大多都是用unity还原实现的。那么用cocos实现一版,会是怎样的开发体验呢? 使用版本 使用最新的cocos creator 3.6.2版本 目前主要功能 生成地形方块创建与销毁角色移动、碰撞、重力和简单…

Java-MySQL-SQL函数

SQL函数 函数介绍 函数是 SQL 的一个非常强有力的特性,函数能够用于下面的目的: ● 执行数据计算 ● 修改单个数据项 ● 操纵输出进行行分组 ● 格式化显示的日期和数字 ● 转换列数据类型 SQL 函数有输入参数,并且总有一个返回值。 …

【云原生系列CKA备考】Kubernetes架构

目录前言一、Kubernetes架构1.1Master节点1.2 Node节点1.3 Add-ons1.3 Kubeadm二、相关命令2.1 查看组件运行状态2.2 kubeadm容器化组件三、总结前言 ​ OpenStack是管理虚拟机的,底层依靠虚拟化技术;kubernetes是管理容器的,底层也是依靠虚…