首页 > 其他分享 >RTP --- 协议介绍

RTP --- 协议介绍

时间:2024-11-15 17:42:31浏览次数:1  
标签:协议 char 00 比特 unsigned --- RTP NALU

 RTP报文格式

12字节头部 + payload

12字节头部

struct rtp_hdr {
#ifdef BIGENDIAN
    unsigned char v:2;          /* protocol version */
    unsigned char p:1;             /* padding flag */
    unsigned char x:1;             /* header extension flag */
    unsigned char cc:4;           /* CSRC count */

    unsigned char m:1;             /* marker bit */
    unsigned char pt:7;            /* payload type */
#else
    unsigned char cc:4;
    unsigned char x:1;
    unsigned char p:1;
    unsigned char v:2;

    unsigned char pt:7;
    unsigned char m:1;
#endif
    unsigned short seq;            /* sequence number */
    unsigned int   ts;          /* timestamp */
    unsigned int   ssrc;        /* synchronization source */
#if 0
    unsigned int   csrc[2];        /* optional CSRC list */
#endif
};

*版本号(V):2比特,用来标志使用的RTP版本。

*填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。

*扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。

*CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。

*标记位(M):1比特,当RTP负载是一个完整的NALU时M 位置为 1;当前RTP 数据包为一个NALU 的最后的那个分片时(NALU 的分片在后面讲述),M位置 1。其余情况下M位保持为 0。

*载荷类型(PT):7比特,标识了RTP载荷的类型。

*序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。

*时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。

*同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。

*贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。

payload

payload 的组成和封包模式有关

单一封包模式

对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式。对于一个原始的 H.264 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的长度超过MTU时,就必须对NALU单元进行分片封包,也称为Fragmentation Units(FUs)。payload 的组成如下,1字节 FU indicator,1字节 FU header,若干字节 FU payload

F、NRI 和 NALU 的头的 F、NRI 一样

S:标记该分片打包的第一个RTP包 

E:该分片打包的最后一个RTP包

Type:NALU的头的Type

 

FU payload 是去掉起始码和头部的NALU

 

标签:协议,char,00,比特,unsigned,---,RTP,NALU
From: https://www.cnblogs.com/god-of-death/p/18548383

相关文章

  • 仓颉_Cangjie-函数式编程
    函数定义CC语言中,函数的声明告诉编译器函数的名称、返回类型和参数列表。函数的定义则提供了函数的实际体C++返回类型函数名(参数列表){//函数体//执行的操作//返回返回类型的值}Java函数的定义分为函数的声明和函数的实现Rust使用fn关键字定义函数。函......
  • 虚拟串口工具和串口调试工具详解 - 附下载地址
    简介串口开发过程中,一般需要以下工具用于开发和调试: 虚拟串口工具简介虚拟串口软件,可以在系统中虚拟出串口,这样开发人员可以在没有物理串口设备的情况下进行开发.串口调试工具简介串口调试工具主要用于给串口发送信息,测试串口是否连通,发送消息是否正常被接收等.......
  • 泷羽sec-shell脚本创建执行与变量使用
    shell脚本创建vimxx.sh可以利用#!/bin/bash、#!/bin/dash、#!/bin/sh这三种其实不管用哪种脚本解释器最后调用的还是这个dash比如ls-lbin/sh发现调用的还是dash执行方法一./xx.sh #默认没有执行权限chmod+xxx.sh方法二shxx.shbashxx.shdashxx.sh......
  • hbase-2.2.7分布式搭建文档(附详细操作步骤命令及相关操作截图)
    hbase-2.2.7分布式搭建文档一,搭建前准备1.检查是否已经安装JDK2.搭建hbase前需要先搭建好hadoop3.检查zookeeper是否正常启动#启动zookeeper(三台都要启动)zkServer.shstart#查看zookeeper状态(一个leader两个follower)zkServer.shstatus4.到官网或国内镜像站下载hba......
  • GoFurther - Chapter 5: Database Setup and Configuration
     zzh@ZZHPC:/zdata/Github/greenlight$dockerpullpostgreszzh@ZZHPC:/zdata/Github/greenlight$dockerrun--namepostgres17-p5432:5432-ePOSTGRES_USER=root-ePOSTGRES_PASSWORD=root-dpostgres:latest zzh@ZZHPC:~$dockerexec-itpostgres17psql......
  • 公网服务器必备--ssh auto deny
    问题?公网上的服务器被一群无聊的人做密码爆破(我曾经也是其中的一员......
  • 列表数据隔离--采购申请单只能看当前用户的单据信息 过滤,PrepareFilterParameter 2
    region<<版本注释>>/*===================================================类名称:PUR_Requisition_listFilter类描述:列表数据隔离--采购申请单只能看当前用户的单据信息过滤,PrepareFilterParameter创建人:luohong创建时间:2024/11/1516:18:04电子邮箱:it_lu......
  • SELF-REFINE: Iterative Refinement with Self-Feedback
    1.概述基于给定的Prompt,大语言模型生成的Reponse可能不是最好的(这一点我认为当前的LLM大部分都是Decoder架构,基于已生成的结果产生下一个Token,一旦之前生成结果出错,也不容易及时改正。)。本文为原始的生成添加了额外的反思重写步骤,过程如下:对于给定的\(Input\),先交给LLM生成......
  • 21-网络设备安全
    21.1概况1)交换机安全威胁交换机是构成网络的基础设备,主要的功能是负责网络通信数据包的交换传输MAC地址泛洪(flooding):通过伪造大量的虚假MAC地址发往交换机ARP(地址解析协议(AddressResolutionProtocol)包)欺骗:攻击者可以随时发送虚假ARP包更新被攻击主机上的ARP缓存,进......
  • Docker不再神秘 ------Ubuntu20.04 安装Docker 及实用技巧,建议收藏
    Dockerdocker是一种容器,简而言之就是别人把一堆环境配置好了,你可以下载下来直接拿来使用(我的个人理解),有点像虚拟机你知道吧。比如下面这样,我直接打开了一个小电脑(docker),里面桌面啊、root啊全都有,跟你ubuntu系统类似,单说细节还不完全一样,毕竟它轻便哈哈……也有一些对比这下......