FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提:

注意的是:我们这里是从avframe转换成avpacket 后,从avpacket中查看NALU。

在实际开发中,我们有可能是从摄像头中拿到 RGB 或者 PCM,然后将pcm打包成avframe,然后将avframe转换成avpacket,然后直接就通过网络传播avpacket了,

那么在网络传输的过程中如何传送这个avpacket呢?这就要用到 NALU 了。

关于NALU是啥?可以参考这个:

音视频开发14 FFmpeg 视频 相关格式分析 -- H264 NALU格式分析-CSDN博客

为了方便在网络上传输的一种抽象层。一般网络上传输的数据包有大小限制,而AVC(H264)的一帧大小远远大于网络传输的字节大小限制。因此要对AVC的数据流进行拆包,将一帧数据拆分为多个包传输。和NAL层相对是VAL层,即视频编码层(Video Coding Layer)

NALU就是经过分组后的一个一个数据包。

发I帧之前,⾄少要发⼀次SPS和PPS。当分辨率变化的时候,要重新发送一次SPS和PPS(类似在视频网站上,我们将分辨率从720p变成1080p的时候)

这个很重要,如果遇到我们显示不了图片或者视频的时候,应该第一个检查的就是 SPS 和PPS是否有正确的发送。

SPS:序列参数集,SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。

PPS:图像参数集,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。

I帧:帧内编码帧,可独⽴解码⽣成完整的图⽚。

P帧: 前向预测编码帧,需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。

B帧: 双向预测内插编码帧,则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。

每个NALU = StartCode + 由一个1字节的NALU头部 + 一个包含控制信息或编码视频数据的字节流组成。

NALU 结构单元的主体结构如下所示;⼀个原始的 H.264 NALU 单元 通常由 [StartCode] [NALU
Header] [NALU Payload] 三部分组成。

Start Code ⽤于标示这是⼀个 NALU 单元的开始,
必须是"00 00 00 01" 或 "00 00 01" ,
H.264 标准指出,当数据流是储存在介质上时,在每个 NALU 前添加起始码: 0x000001 或
0x00000001 ,⽤来指示⼀个 NALU 的起始和终⽌位置:
在这样的机制下,在码流中检测起始码,作为⼀个 NALU 得起始标识,当检测到下⼀个起始码时,当前NALU 结束。
3 字节的 0x000001 只有⼀种场合下使⽤,就是⼀个完整的帧被编为多个 slice (⽚)的时
候,包含这些 slice 的 NALU 使⽤ 3 字节起始码。其余场合都是 4 字节 0x00000001 的。
NALU Header :
NALU Header占位8Bit,其中三个字段分别为

F 为禁⽌位,占 1bit  
forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0。
R为重要性指示位,占 2个 bit 
nal_ref_idc :取 00~11, 似乎指示这个 NALU 的重要性 , 如 00 的 NALU 解码器可以丢弃它⽽不影响图像的回放,0 ~ 3 ,取值越⼤,表示当前 NAL 越重要,需要优先受到保护。如果当前 NAL是属于参考帧的⽚,或是序列参数集,或是图像参数集这些重要的单位时,本句法元 素必需⼤于0 。
T 为负荷 数据类型 ,占 5 bit
nal_unit_type:这个 NALU 单元的类型 ,1 ~ 12 由 H.264 使⽤, 24 ~ 31 由 H.264 以外的应⽤
其值如下:重点是 5,6,7,8
5      Coded slice of an IDR picture                                  VCL
        IDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp( )
6      Supplemental enhancement information (SEI)                     non-VCL
        辅助增强信息 (SEI)sei_rbsp( )
7      Sequence parameter set                                         non-VCL
        序列参数集 seq_parameter_set_rbsp( )
8      Picture parameter set                                          non-VCL
        图像参数集 pic_parameter_set_rbsp( )

0      Unspecified                                                    non-VCL未指定
1      Coded slice of a non-IDR picture                               VCL⼀个⾮IDR图像的编码条带slice_layer_without_partitioning_rbsp()
2      Coded slice data partition A                                   VCL编码条带数据分割块A slice_data_partition_a_layer_rbsp()
3      Coded slice data partition B                                   VCL编码条带数据分割块B slice_data_partition_b_layer_rbsp( )
4      Coded slice data partition C                                   VCL编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
5      Coded slice of an IDR picture                                  VCLIDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp( )
6      Supplemental enhancement information (SEI)                     non-VCL辅助增强信息 (SEI)sei_rbsp( )
7      Sequence parameter set                                         non-VCL序列参数集 seq_parameter_set_rbsp( )
8      Picture parameter set                                          non-VCL图像参数集 pic_parameter_set_rbsp( )
9      Access unit delimiter                                          non-VCL访问单元分隔符 access_unit_delimiter_rbsp( )
10     End of sequence                                                non-VCL序列结尾 end_of_seq_rbsp( )
11     End of stream                                                  non-VCL流结尾end_of_stream_rbsp( )
12     Filler data                                                    non-VCL填充数据filler_data_rbsp( )
13     Sequence parameter set extension                               non-VCL序列参数集扩展seq_parameter_set_extension_rbsp( )
14     Prefix NAL unit                                                non-VCLNAL 单元前缀
15     Subset sequence parameter set                                  non-VCL子集序列参数集
16     Depth parameter set                                            non-VCL深度参数集
17..18 Reserved                                                       non-VCL保留
19     Coded slice of an auxiliary coded picture without partitioning non-VCL未分割的辅助编码图像的编码条带slice_layer_without_partitioning_rbsp( )
20     Coded slice extension                                          non-VCL编码切片扩展
21     Coded slice extension for depth view components                non-VCL深度视图组件的编码切片扩展
22..23 Reserved                                                       non-VCL保留
24..31 Unspecified                                                    non-VCL未定义

这里只是将之前的博客弄了一部分过来,请完全阅读。

从一个avpacket中获取 NALU,解析NALU头部。

我们这里从传递的avpacket中获取NALU,并获取头部。要研究的是通过 h264编码器后,avpacket中NALU 的头部信息,看是否发送了 PPS 和 SPS 等重要信息。

如下代码中打印的 nal_unit_type 就是每个NALU 头部字节的后5位,得到这个值就可以对比5,6,7,8,看发送的是啥,有没有发送PPS,SPS等。

	///通过h264编码器后的avpacket,解析avpacket里面的NALU///第一个问题是 如何从 avpacket如何分离出 每个 NALU呢?/// 一个avpacket 的NALU  和 下一个avpacket 的NALU 是以 0001间隔/// 但是一个avpacket中是有多个 NALU组成的,一个avpacket之内是以 001间隔的。avpacketcount++;//计算总共有多少个avpacketunsigned char naluheader = *(avpacket->data + 4);//跳过0001个字节/// naluheader这一个字节 8位是这样的:第一位是禁用位; 2,3位表示该NALU的重要性,4-7位标识是个啥类型的NALU:SPS,PPS,IDR 等,int nal_unit_type = naluheader & 0X1F;cout << "   nal_unit_type = " << nal_unit_type;//然后呢一个 avpacket中可能有多个 NALU,以001间隔开的,还需要找到这些头部for (int i = 4; i < avpacket->size - 4; i++) //一个data中由多条nalu{if (avpacket->data[i] == 0 &&avpacket->data[i + 1] == 0 &&avpacket->data[i + 2] == 1) {   ///001nal_unit_type = avpacket->data[i + 3] & 0x1f;avpacketcount++;cout << "(" << nal_unit_type << ")" << flush;}}

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

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

相关文章

从0学习React(11)

1. 引言 上个星期的工作内容是写IT资产管理的前端页面。其实&#xff0c;尽管我之前有一些前端开发的经验&#xff0c;但并不是很多。这次让我独立完成一个页面的开发&#xff0c;刚开始时我感到无从下手。 2. 初期的困惑和焦虑 我记得在星期一和星期二的时候&#xff0c;那…

BILSTM法律网站用户提问自动分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

unity 一个物体随键盘上下左右旋转和前进的脚本

注意&#xff1a;脚本挂在gamaobject 上面 &#xff0c;操作对象的目标 this.gameObject 为操作对象 using System.Collections; using System.Collections.Generic; using UnityEngine;public class changePosition : MonoBehaviour {//操作对象的目标 this.gameObject 为操…

【论文阅读】Virtual Compiler Is All You Need For Assembly Code Search

阅读笔记:Virtual Compiler Is All You Need For Assembly Code Search 1. 研究背景 逆向工程:逆向工程需要在庞大的二进制文件中快速定位特定功能(例如恶意行为)。传统方法依赖于经验和启发式算法,效率低下。汇编代码搜索:通过自然语言搜索汇编代码功能,能够更高效地处…

Wireshark中的length栏位

注&#xff1a;Ethernet II的最小data length为46&#xff0c;如果小于&#xff0c;会补全到46. 1.指定网卡抓取的&#xff0c;链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

CentOS网络配置

上一篇文章&#xff1a;VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数&#xff0c;以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…

前端搭建低代码平台,微前端如何选型?

目录 背景 一、微前端是什么&#xff1f; 二、三大特性 三、现有微前端解决方案 1、iframe 2、Web Components 3、ESM 4、EMP 5、Fronts 6、无界&#xff08;文档&#xff09; 7、qiankun 四、我们选择的方案 引入qiankun并使用&#xff08;src外层作为主应用&#xff09; 主应…

CSS:怎么把网站都变成灰色

当大家看到全站的内容都变成了灰色&#xff0c;包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&#xff1f; 有人会以为所有的内容都统一换了一个 CSS 样式&#xff0c;图片也全换成灰色的了&#xff0c;按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了…

基于Spring Boot的计算机课程管理:工程认证的实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

flinkOnYarn并配置prometheus+grafana监控告警

flinkOnYarn并配置prometheusgrafana监控告警 一、相关服务版本&#xff1a; flink版本&#xff1a;1.17.2 pushgateway版本&#xff1a;1.10.0 prometheus版本&#xff1a;3.0.0 grafana-v11.3.0参考了网上的多个文档以及学习某硅谷的视频&#xff0c;总结了一下文档&#x…

在esxi8.0中安装黑群晖的过程记录及小问题处理

问题记录 1.某种原因在网页中安装系统后&#xff0c;发现synology搜出来的设备还是169的地址&#xff0c;但是点击设置需要输入管理员账号密码才能设置ip&#xff0c;试了一下&#xff0c;账号输入admin&#xff0c;密码留空正常设置。 2.晚上试了一下&#xff0c;在全新的esxi…

基于微信小程序的公务员考试学习平台的设计与实现,LW+源码+讲解

摘 要 小程序公考学习平台使用Java语言进行编码&#xff0c;使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务&#xff0c;其管理小程序公考学习平台信息&#xff0c;查看小程序公考学习平台信息&#xff0c;管理小程序公考学习平台。 总之&#x…

深度学习之pytorch常见的学习率绘制

文章目录 0. Scope1. StepLR2. MultiStepLR3. ExponentialLR4. CosineAnnealingLR5. ReduceLROnPlateau6. CyclicLR7. OneCycleLR小结参考文献 https://blog.csdn.net/coldasice342/article/details/143435848 0. Scope 在深度学习中&#xff0c;学习率&#xff08;Learning R…

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品&#xff0c;是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要&#xff0c;专门加工配置而成的配方食品&#xff0c;包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…

数据产品:深度探索与案例剖析

​在当今数字化时代&#xff0c;数据产品正逐渐成为各行业发展的关键驱动力。让我们深入了解数据产品的分类与特点&#xff0c;以及通过典型案例分析&#xff0c;感受数据产品的强大魅力。 首先&#xff0c;数据产品主要分为报表型、分析型、平台型等不同类别。 报表型数据产品…

opc da 服务器数据 转 IEC61850项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 用IEC61850协议转发数据 7 网关使用多个逻辑设备和逻辑节点的方法 8 在服务器上运行仰科OPC DA采集软件 9 案例总结 1 案例说明 在OPC DA服务器上运行OPC …

Vue3 -- 环境变量的配置【项目集成3】

环境&#xff1a; 在项目开发过程中&#xff0c;至少会经历开发环境、测试环境和生产环境(即正式环境)三个阶段。 开发环境 .env.development测试环境 .env.test生产环境 .env.production 不同阶段请求的状态(如接口地址等)不一样&#xff0c;开发项目的时候要经常配置代理跨…

Go八股(Ⅴ)map

1.哈希表 哈希表用来存储键值对&#xff0c;通过hash函数把键值对散列到一个个桶中。 Go使用与运算&#xff0c;桶个数m&#xff0c;则编号[0,m-1]&#xff0c;把键的hash值与m-1与运算。**为了保证所有桶都会被选中&#xff0c;m一定为2的整数次幂。**这样m的二进制数表示一…

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备&#xff1a; 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…