流媒体传输 - RTP 荷载 H265

news2025/1/17 2:54:57

H265 码流结构

H265 码流和是由很多 NAL Unit 组成,所有 NAL Unit 均存在一个 16 位数据的 NAL Unit Header ,一个 NAL Unit Header 的语法如下:

        +---------------+---------------+
        |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |F|   Type    |  LayerId  | TID |
        +-------------+-----------------+
​
Figure 1: The Structure of the H265 NAL Unit Header

  • F: 1bit forbidden_zero_bit,在 H.265 规范中规定了这一位必须为 0。它的作用是在尚存 MPEG-2 系统环境中,防止产生可以解释为 MPEG-2 起始码的比特模式。

  • Type: 6bit 其允许的 NAL Unit 的类型编码比 H264 多一倍,达到了 64 类,其中 32 类作用于 VCL NAL Unit,32 类作用于 non-VCL NAL Unit。

  • LayerId: 6bit 用于 H265 拓展层标识符

  • TID: 3bit temporal_id,表示 H265 的接入单元(AU)属于哪个时域子层,时域标识符值为 0 到 6。

H265 码流打包

RFC 7798 Section 4.4 指定了四种不同类型的 RTP 数据包有效负载结构:

  • 单 NAL 单元模式(Single NAL Unit Packet): 仅包含单个 NAL Unit 的有效载荷。

  • 组合封包模式(Aggregation Packet):用于聚合多个 NAL Unit 的分组类型成为单个 RTP 有效负载。

  • 分片封包模式(Fragmentation Unit):用于将单个 NAL Unit 分段成多个 RTP 数据包。

  • 携带 RTP 数据包的 PACI:包含有效载荷报头(与其他有效载荷报头有所不同),有效载荷报头扩展结构(PHES)和 PACI 有效载荷。

    其中常用的有两种类型:单 NAL 单元模式和分片封包模式。

单 NAL 单元模式

一个 RTP 包仅由一个完整的 NALU 组成。这种情况下 RTP 的 NAL 头类型字段 PayloadHdr 和原始的 H.265 的 NALU Header 字段是一样的。

对于 NALU 的长度小于 MTU 大小的包,一般采用单一 NAL 单元模式。一个原始的 H.264 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 包即可。

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           PayloadHdr          |      DONL (conditional)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                  NAL unit payload data                        |
|                                                               |
|                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               :...OPTIONAL RTP padding        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
​
      Figure 3: The Structure of a Single NAL Unit Packet

分片封包模式

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

分片封包模式(FU)能将单个 NAL 单元分段成多个 RTP 数据包。

NAL 单元的片段由该 NAL 单元的整数个连续八位位组组成。 分片封包的 NAL 单元必须以升序的 RTP 序列号连续顺序发送(同一 RTP 流中的其他 RTP 数据包不得在第一个片段与最后一个片段之间发送)。

FU 绝对不能嵌套; 即,FU 一定不能包含另一个 FU 的子集。

携带 FU 的 RTP 分组的 RTP 时间戳被设置为分段 NAL 单元的 NALU 时间。

FU 由一个有效负载报头(PayloadHdr),一个 8bit 的 FU Header,一个有条件的 16 位 DONL 字段和 FU 有效负载组成,如下图所示。

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    PayloadHdr (Type=49)       |   FU header   | DONL (cond)   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| DONL (cond)   |                                               |
|-+-+-+-+-+-+-+-+                                               |
|                         FU payload                            |
|                                                               |
|                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               :...OPTIONAL RTP padding        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
​
            Figure 9: The Structure of an FU

PayloadHdr 的字段含义与 NALU Header 的字段含义一直,其各字段设置为: - Type 字段必须等于 49 - 字段 F,LayerId 和 TID 必须分别等于分段的 NAL 单元的字段 F,LayerId 和 TID

FU header 包含 1bit 的字段 S,1 字节的字段 E 和 6bit 的字段 FuType:

        +---------------+
        |0|1|2|3|4|5|6|7|
        +-+-+-+-+-+-+-+-+
        |S|E|  FuType   |
        +---------------+
​
Figure 10: The Structure of FU Header
  • S: 1bit 当设置为 1 时,S 位指示分段 NAL 单元的开始,即 FU 有效载荷的第一个字节也是分段 NAL 单元的有效载荷的第一个字节。 当 FU 有效载荷不是分段式 NAL 单元有效载荷的开始时,必须将 S 位设置为 0。

  • E: 1bit 当设置为 1 时,E 位表示分段 NAL 单元的末尾,即有效载荷的最后一个字节也是分段 NAL 单元的最后一个字节。 当 FU 有效负载不是分段的 NAL 单元的最后一个分段时,E 位务必设置为 0。

  • FuType: 6bit 字段 FuType 必须等于分段的 NAL 单元的字段 Type。

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

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

相关文章

电感啸叫产生的根本原因及解决方法

电感啸叫产生的根本原因及解决方法 【摘 要】环形电感或工形电感啸叫问题,在稳压电源电路的设计经常遇到,根据稳压电源芯片的不同和外围电路的不同,解决方法也各不相同,本文档的宗旨是分析电感啸叫的根本原因,并综合各…

使用Psycopg2连接openGauss

文章目录1.简介2.接口介绍开发流程接口说明3.使用3.1环境准备3.2下载并加载python驱动3.3创建数据库连接用户3.4示例4.常见报错1.简介 Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、openGauss数据库提供统一访问接口,应用程序可基于它进…

我们为什么喜欢看疯狂科学家开飞艇?

很多人可能不是科幻迷,也在日常生活中接触过蒸汽朋克。为什么呢?很简单——蒸汽朋克几乎无处不在。相比其他科幻流派,蒸汽朋克可能算是最“出圈”的一种。简单地说,蒸汽朋克是一种科幻小说类型,由“蒸汽 ”(steam)和“…

微服务框架 SpringCloud微服务架构 3 Eureka 3.5 服务发现

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构3 Eureka3.5 服务发现3.5.1 在order-service完成服务拉取3.5.2 总结3 Eure…

实习day1

今天部署东西: docker compose -f docker-compose.yml up -d 知道这个命令是什么意思 先进入decays里面,再进去corepack ,在进入yarn安装代码。 需要进入路径然后run 这个东西 c:\Users\yuan\PycharmProjects\decsys\app\Decsys>dotnet…

IBM MQ命令:DEFINE AUTHINFO

此命令里有很多内容值得一看。 https://www.ibm.com/docs/en/ibm-mq/8.0?topiccommands-define-authinfo#q085490___6 一,CHCKCLNT CHCKCLNT This attribute determines the authentication requirements for client applications, and is valid only for an A…

复制淘宝宝贝上传,宝贝的属性是错误的,怎么修改为正确的属性?

大家都知道,淘宝的发布要求是在不断变化的,以前发布宝贝没有这要求,但现在有可能就有这要求了,比如说以前这一属性可以随便填,但现在发布必须按照他的要求去填,不然发布不成功。近期,小编就有收…

什么是联盟营销以及如何使用它在网上赚更多的钱

无需创建自己的任何产品即可通过您的网站、社交媒体或博客在线赚钱。您可以使用联盟网络营销。如果您听说过联盟营销,但不确定它是什么或它是如何运作的,那么本文是一个很好的起点。 如果您已经熟悉这个概念,并且想知道如何开始使用它从您的博…

【DL with Pytorch】第 3 章 :使用 DNN 的分类问题

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

尚硅谷ES6复习总结上(64th)

1. let 关键字 let 关键字用来声明变量,使用 let 声明的变量有几个特点: 1、不允许重复声明 2、块级作用域 if (true) {let a 10; } console.log(a) // a is not defined3、不存在变量提升 console.log(a); //报错let a 20;4、不影响作用域链 以后声…

ggrcs 包2.4绘制RCS(限制立方样条图)实际操作演示(1)

ggrcs 包2.4版本已经发布一段时间了,大概几个月了吧,收到不少好评, 没听说太大的问题,最主要的问题有两个: 1.是说变量不是数字变量。 2.是说数据超过10万,无法处理 第一个问题非常好处理,这…

【一文秒懂——Profile配置】

目录 1. Profile配置 2. 实例 1. Profile配置 Spring框架允许使用Profile配置,即某些“个性化配置文件”,这些配置文件默认并不会被应用,需要“激活”后才生效! 在Spring Boot项目中,简化了Profile配置的使用&…

智能型电动机保护器(马保)可应用在水泥厂,保证生产过程的连续不间断

安科瑞 李可欣 具体可咨询:Acrel_lkx 一、水泥厂的要求 水泥生产是一项较庞大的工程,生产环境比较恶劣,粉尘污染严重,受生产工艺的限制使得其工作场所的通风条件差且环境温度较高,而且需要设定大量的工作站点&…

NetCore路由的Endpoint模式

IdentityServer里有各种Endpoint,如TokenEndpoint,UserInfoEndpoint,Authorize Endpoint,Discovery Endpoint等等。Endpoint从字面意思来看是“终端节点"或者“终节点”的意思。无独有偶NetCore的路由也有Endpoint的概念。那么我们提出一个问题来,究竟什么是En…

R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计

全文链接:http://tecdat.cn/?p19664 MCMC是从复杂概率模型中采样的通用技术。蒙特卡洛马尔可夫链Metropolis-Hastings算法(点击文末“阅读原文”获取完整代码数据)。问题如果需要计算有复杂后验pdf p(θ| y)的随机变量…

中远通创业板IPO过会:上半年营收7.3亿 拟募资2.3亿

雷递网 雷建平 11月28日深圳市核达中远通电源技术股份有限公司(简称:“中远通”)日前IPO过会,准备在深交所创业板上市。中远通计划募资2.3亿元。其中,1.3亿元用于研发中心改造提升项目,3248万元用于企业信息…

规则引擎Drools在贷后催收业务中的应用

作者:vivo 互联网服务器团队- Feng Xiang 在日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景。为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务人员,为了达到这种目的通常我们会使用规则引擎…

(十八)Spring6集成MyBatis3.5

文章目录实现步骤具体实现第一步:准备数据库表第二步:IDEA中创建一个模块,并引入依赖第三步:基于三层架构实现,所以提前创建好所有的包第四步:编写pojo第五步:编写mapper接口第六步:…

怎么建网站?【模版建站】

关于怎么建网站,除了公司企业,甚至有些个人用户都想了解。大家印象中的建站网站都是要会编程,不然就是找外包公司解决。其实现在建网站也是比较简单的,模版建站一般都能解决基本的建站需求。下面我们一起来看看怎么建网站吧。 一…

考阿里云ACE需要准备什么?考试内容难不难?

最近几年云计算技术发展得越来越好,市场上大多数企业已经选择转型,使用云计算技术来发展自己的新业务,这样一来就需要大量的人才来维持市场的运行。另一方面,为了在现在内卷的社会中的脱颖而出,获得一份稳定、高薪的工…