从零开始精通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.mzph.cn/pingmian/2905.shtml

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

相关文章

uniapp配置了pages.json 的 tabbar 国际化,小程序切换语言没有实时切换

如上图,按照uniapp官方文档配置了tabbar的国际化 但是微信小程序实时切换语言没有实时刷新 解决方案: 在App.vue中加入以下代码: 在onLaunch中执行方法即可

DevOps(十二)Jenkins实战之Web发布到远程服务器

前面两篇博文介绍了怎么将django开发的web应用推送到gitlab源码仓库,然后jenkins服务器从gitlab仓库拉下来,布署到jenkins服务器上,并用supervisor进行进程管理,保证web应用一直能正常运行,今天我们继续优化&#xff0…

云原生Kubernetes: K8S 1.29版本 部署ingress-nginx

目录 一、实验 1.环境 2. K8S 1.29版本 部署ingress-nginx 二、问题 1.kubectl 如何强制删除 Pod、Namespace 资源 2.创建pod失败 3.pod报错ImagePullBackOff 4.docker如何将镜像上传到官方仓库 5.创建ingress报错 一、实验 1.环境 (1)主机 表…

学习指导|在改变

备忘在这里啦。潦草本草

css中新型的边框设置属性border-inline

一、概念与背景 border-inline 是 CSS Logical Properties and Values 模块中的一个属性,用于控制元素在流内(inline)方向上的边框。该模块旨在提供与书写模式(writing mode)无关的布局和样式描述方式,使得…

JS中的循环结构[for,while,do while]结构分析及实例讲解。流程控制语句[break和continue]分析及讲解

循环结构分析及示例 for循环 for循环是一种基于计数器的循环,允许自定义循环的初始化、条件和迭代步骤。 语法: for (初始化表达式;测试表达式;更新表达式){ // 循环体 } 初始化表达式:在循环开始前执行一次,通常用…

【1429】招生管理管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 招生管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

内蒙古自治区工程系列生态环境专业技术人才职称评审条件

内蒙古自治区工程系列生态环境专业技术人才职称评审条件链接关于印发《内蒙古自治区工程系列生态环境专业技术人才职称评审条件》的通知_内蒙古自治区人民政府类别基本条件业绩成果备注助理工程师1.具备硕士学位或第二学士学位;2.具备大学本科学历或学士学位&#x…

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测 亮点: 输出多个评价指标:R2,RMSE,MSE,MAPE和MAE 满足需求,分开运行和对比的都有对应的主函数:main_BP, main_PO, main_BPvsBP_PO&#x…

LeetCode 题目 66:加一【python5种算法实现】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…

Redis入门到通关之Redis网络模型-用户空间和内核态空间

文章目录 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。 博客特色: 在我的…

DevOps(十三)Jenkins之Selenium插件配置

一、Selenium Grid详细介绍 Selenium Grid 是 Selenium 测试套件的一部分,主要用于通过并行执行测试来提高测试执行的速度和效率。它允许您在多个环境(不同的浏览器和操作系统)上同时运行测试,从而帮助在开发过程中快速发现跨浏览…

Github 2024-04-25Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revised” Lic…

spark3.0.0单机模式安装

注:此安装教程基于hadoop3集群版本 下载安装包 下载spark3.0.0版本,hadoop和spark版本要对应,否则会不兼容 用xftp上传Linux虚拟机,上传目录/bigdata(可修改) 解压 tar -zxvf /bigdata/spark-3.0.0-bin-h…

背包问题汇总

本文涉及知识点 动态规划汇总 状态机dp 01背包 有n件物品,体积分别是v[i],价值分别是w[i],有个包的容积是bv。如何选择物品使得,在总体积不超过vb的前提下,让总价值最大。 动态规划的状态表示 dp[i][j] 表示处理完…

go垃圾回收机制

Go 语言的垃圾回收(Garbage Collection, GC)机制是其内存管理的核心部分,它负责自动检测并回收不再使用的内存。Go 的垃圾回收机制可以分为以下几个主要类别: 1. 标记(Mark) 根节点:垃圾回收从…

适用于WPF模式开发的主题和控件库Material Design

简介: MaterialDesignInXamlToolkit 是一个开源的 GUI 库,它提供了 Google Material Design 风格的 GUI 元素,可以在 .NET Framework 和 .NET Core 上使用。它的目的是帮助 .NET 开发人员快速构建具有现代化外观的应用程序。 MaterialDesignInXamlToolkit 包含了许多常用的…

CentOS 7.9.2009 中 Docker 使用 GPU

一、安装nvidia驱动 1.1,查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2,进入 PCI devices ,输入上一步查询到的 2204 1.3,进入 官方驱动 | NVIDIA,查询 Geforce RTX 3090 驱动并下载 1.4,禁用…

冯老师降维打击申论课

冯老师降维打击申论课,以其独到的见解和精湛的教学技巧,将复杂的申论知识变得简单易懂。通过深入浅出的讲解,帮助考生迅速掌握申论精髓,轻松应对考试。课程内容丰富实用,深受考生好评,是备考申论的不二之选…