从零开始精通RTSP之深入理解RTP包

概述

        RTP包是用于在互联网上传输实时音视频,或其他类型时间敏感数据的标准数据包格式。它是多媒体通信领域中的核心组件,尤其在实时流媒体应用(比如:视频会议、在线直播、IP电话、安防监控等)中扮演着至关重要的角色。RTP包由RTP报文头和RTP负载两部分组成,其中,RTP报文头是固定的12个字节,而RTP负载则是可变的,取决于具体的媒体数据。

RTP报文头

        RTP报文头包含了必要的信息来识别、同步和管理数据包,其格式如下。

        Version (V):占2位,表示RTP协议的版本,当前的标准版本为2。

        Padding (P):占1位,若置位,则表示包尾存在一些填充字节,用于确保下一层协议(比如:UDP)的数据包长度是某些特定值的整数倍。

        Extension (X):占1位,指示是否包含RTP头部扩展。如果有扩展,它们紧跟在标准头部之后。

        CSRC Count (CC):占4位,表示“贡献源”(Contribution Source)标识符(CSRC)的数目,用于标识参与混音的多个源。

        Marker (M):占1位,通常用于标记负载中的重要事件或边界(比如:视频帧的关键帧)。

        Payload Type (PT):占7位,指定负载中携带的媒体数据类型(比如:G711语音、H264视频等)。具体的类型值可通过RFC 3551等文档查询,或者由应用层协商确定。PT值表示的媒体数据类型分为两种:静态类型和动态类型。静态类型的PT值的范围为0-95,对应于常见的音频、视频编码格式,比如:G711语音为PT=0、H264视频为PT=96等。动态类型的PT值的范围为96-127,用于私有或特定应用的编码格式,这些类型通常在会话建立阶段通过SDP或其他信令协议协商确定。

        Sequence Number (SN):占16位,用于标识发送者发出的RTP包的顺序。接收方可以根据序列号检测数据包丢失、重排序等情况,并进行相应的恢复处理。

        Timestamp (TS):占32位,表示媒体数据的采样时间,是实现媒体同步的关键。对于连续媒体,该值通常表示从会话开始以来的采样时间增量。对于离散媒体(比如:静态图像),可能表示绝对时间或相对时间戳。

        SSRC (Synchronization Source Identifier):占32位,全局唯一,标识数据包的发送源。即使在一个会话中有多个同步源(比如:多路视频流),每个源都有自己的SSRC,便于接收方区分并同步不同的媒体流。

        CSRC List:如果CC非零,这里将列出CC个32位的CSRC标识符,每个代表一个参与混合的音频源。

RTP报文头扩展

        RTP报文头扩展用于为标准RTP报文头增加额外的可选字段,以满足特定应用的需求或提供增强的功能。通过使用报文头扩展,可以在不修改基本RTP协议的情况下,为RTP数据包添加定制化的信息,提高协议的灵活性和可扩展性。

        RTP报文头扩展包含的具体字段如下。

        Extension Profile ID:16位字段,标识使用的扩展类型。该值由IANA维护的RTP Header Extension Registry分配给特定的扩展规范,比如:1对应于One-Byte Header Extensions(RFC 5285),2对应于Two-Byte Header Extensions(RFC 8285)。

        Length:16位字段,表示扩展数据(不包括Profile ID和Length字段本身)的字节数,长度必须是4字节的整数倍。

        Header Extension Data:包含实际的扩展字段。每个扩展字段由一个或多个32位字组成,其布局和解释取决于所使用的扩展类型和Profile ID。

        下面重点介绍一下One-Byte Header Extensions和Two-Byte Header Extensions。

        One-Byte Header Extensions:这种扩展格式的每个字段由一个1字节的类型标签(Type)和一个1字节的长度字段(Length)组成,后面跟着实际的值(Value)。每个字段占用至少4字节,并且可以连续放置多个字段。

        Two-Byte Header Extensions:这种扩展格式适用于需要更多类型的扩展字段。每个字段由一个2字节的类型标签(Type)和一个2字节的长度字段(Length)组成,后面跟着实际的值(Value)。每个字段占用至少6字节,同样可以连续放置多个字段。

        需要特别注意的是:由于报文头扩展增加了RTP包的大小,可能会影响MTU的计算和分片处理。应合理选择和配置扩展字段,避免过度增大包尺寸导致传输效率降低。

RTP负载

        RTP负载是紧跟在RTP报文头之后的部分,它承载着实际的实时媒体数据,比如:视频帧、音频帧等。RTP负载的结构、内容和格式,直接与RTP报文头中的负载类型(Payload Type,PT)字段所指定的媒体编码类型密切相关。下面,介绍一些典型的负载格式。

        视频:视频负载通常包含一个或多个压缩编码的视频帧。一个帧可能由多个NAL单元组成。比如:H.264编码中,每个NAL单元前通常有一个起始码(0x000001或0x00000001),用于在传输过程中定位帧的边界。帧的内容可能包括I帧(关键帧)、P帧(预测帧)或B帧(双向预测帧),以及相应的编码参数。

        音频:对于音频编码,负载通常包含一串音频采样。每个采样可能是一个或多个字节,具体取决于编码算法(比如:PCM、ADPCM、AAC等)。采样可能按照单声道、立体声或多声道排列,并且可能需要按照特定的字节顺序进行打包。

        文本:可能包含文本消息或聊天记录,按照特定字符编码(如UTF-8)进行序列化。

        在某些情况下,RTP负载可能还需要进一步封装,以适应特定的传输或处理需求。某些负载可能包含特定于编码的头部信息,比如:H.264 NAL单元前的起始码、AAC音频的ADTS头部等。对于大型媒体数据单元(比如:大的视频帧),可能需要按照RFC 2198进行分片,每个RTP包携带一个分片,并使用特定的PT值和头部字段来标识分片顺序和重组信息。

        接收端在接收到RTP包后,首先根据RTP头部的Payload Type字段确定负载的媒体类型和编码格式。然后,按照对应的负载格式解析数据,提取出视频帧、音频帧等媒体数据。最后,结合时间戳、序列号等信息进行同步、错误检测和恢复操作。如果RTP包使用了头部扩展或负载封装,还需相应地处理这些附加信息。

总结

        RTP包的结构简单而高效,能够满足实时音视频传输的需求。通过详细分析RTP报文的各个字段,我们可以更好地理解RTP的工作原理,以及如何优化基于RTP的流媒体应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32f103c8t6学习笔记(学习B站up江科大自化协)-UNIX时间戳

UNIX时间戳 UNIX时间戳最早是在UNIX系统使用的,所以叫做UNIX时间戳,之后很多由UNIX演变而来的系统也继承了UNIX时间戳的规定,目前linux,windows,安卓这些操作系统的底层计时系统都是用UNIX时间戳 时间戳这个计时系统和…

5 个有用的 Linux Shell 转义序列

目录 ⛳️推荐 前言          1、退格符 2、换行符 3、换页符 4、制表符 5、Unicode ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 前言          如何在你的…

计算机网络-IS-IS路由计算

前面已经学习了建立IS-IS邻接关系和同步LSDB,然后基于此路由器会进行路由计算。 一、路由计算 因为IS-IS路由器有不同的级别,只维护自身级别的LSDB,因此就是Level-1只有区域内的路由信息,Level-2有Level-2的路由信息,L…

初始Maven

1.背景 问题引入:为什么要使用 Maven? 1.1 添加第三方 jar 包 在 JavaEE 开发领域,有大量的第三方框架和工具可以供我们使用。使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF 目录中的 lib 目录下。但是会导致每次创建一个新工程就需要将…

【Linux】信号的产生

目录 一. 信号的概念signal() 函数 二. 信号的产生1. 键盘发送2. 系统调用kill()raise()abort() 3. 软件条件alarm() 4. 硬件异常除零错误:野指针: 三. 核心转储 一. 信号的概念 信号是消息的载体, 标志着不同的行为; 是进程间发送异步信息的一种方式, 属于软中断. 信号随时都…

医药流通企业如何安全访问医药ERP?无需公网IP和改变现有IT架构

随着目前医药流通行业竞争的加剧,市场供应日趋饱和,传统的粗放式管理缺陷逐渐暴露,导致从事医药行业企业的利润不同程度的下滑,想要满足医药行业客户的个性化需求,为适应企业未来发展,医药流通行业越来越多…

Docker 安装 Mongo

创建宿主机目录 在你的宿主机上创建必要的目录来存储 MongoDB 的数据和配置文件。这样做可以保证即使容器被删除,数据也能得到保留。 mkdir -p /develop/mongo/data mkdir -p /develop/mongo/config创建 MongoDB 配置文件 创建一个名为 mongod.conf 的 MongoDB 配…

C语言中整型与浮点型在内存中的存储

今天让我们来看看整型的数据和浮点型的数据在内存中是怎么存储的呢 整型数据在内存中的存储 整型数据在内存中存储的是二进制的补码 正数的话也没什么可说的,原码反码补码都相同 我们来看看负数: 以-5为例 原码:10000000 00000000 00000000 0…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…

【HTML】页面引用Vue3和Element-Plus

在现代前端开发中,Vue 3 和 Element Plus 是非常受欢迎的技术。Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架,而 Element Plus 是一个基于 Vue 3 的组件库,提供了丰富的 UI 组件,帮助开发者快速构建高质量的前端应用。 …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透(穿透 wordpress ) 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透(穿透 w…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法是一种基于种群的优化算法,它结合了粒子群优化(Particle Swarm Optimization, PSO)和多目标优化的思想。多目标粒子群(MOPSO&am…

DevOps(八)Jenkins的Maven和Git插件

一、Maven简介 Maven是一个构建生命周期管理和理解工具,用于Java项目。它提供了标准化的构建流程,并简化了从项目编译到文档生成等各种构建方面的管理。 Maven是由Apache软件基金会开发和维护的一个流行的项目管理工具。它的设计目的是简化Java项目的构…

PE结构(二)PE头字段说明

PE头字段 DOS头 PE标记 标准PE头 可选PE头 我们今天分析一下PE头字段中所有重要成员的含义 DOS头 DOS头中我们需要去分析的是如下两个成员: 1.WORD e_magic:MZ标记,用于判断是否为可执行文件,即如果显示4D 5A,…

[2021年最新]国产时序性数据TDenige入门

一、TDenige简介 TDengine:是涛思数据面对高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品,它不依赖任何第三方软件,也不是优化或包装了一个开源的数据库或流式计算产品,而是在吸取众多传统关系型数据库、NoS…

图搜索的经典启发式算法A星(A*、A Star)算法详解

文章目录 1. 引言2. 广度优先搜索3. Dijkstra 算法4. 启发式优先搜索(Heuristic)4.1 贪心最佳优先搜索4.2 A*搜索 1. 引言 在许多场景中,我们常会遇到一类问题,即“找到一个位置到另一个位置的距离最短(用时最少&…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释,Kiabana 服务的默认监听端口为5601 server.po…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤: 动态IP设置: 查找你的网络接口名称: ip a ens37是我NAT模型的一张网卡,此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

Maven多模块快速升级超好用Idea插件-MPVP

功能:多模块maven项目快速升级指定版本插件,并提供预览和相关升级模块日志能力。 可快速进行版本升级,进行部署到Maven仓库。 安装: 可在idea插件中心进行安装 / 下载资源拖动安装 MPVP(Maven) - IntelliJ IDEs Plugin | Marke…

node.js 解析post请求 方法一

前提:依旧以前面发的node.js服务器动态资源处理代码 具体见 http://t.csdnimg.cn/TSNW9为模板,在这基础上进行修改。与动态资源处理代码不同的是,这次的用户信息我们借用表单来实现。post请求解析来获取和展示用户表单填写信息 1》代码难点&…
最新文章