NAL 网络提取层(Network Abstraction Layer)

news2024/12/23 8:22:30

1.NAL全称Network Abstract Layer, 即网络抽象层。

        在H.264/AVC视频编码标准中,无论是存储还是网络传输,H264 原始码流是由一个接一个 NALU(NAL Unit) 组成,整个系统框架被分为两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

        VCL:负责有效表示视频数据的内容,包括核心压缩引擎和块、宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。
        NAL:负责格式化数据并提供头信息,将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

2.视频压缩

2.1帧内压缩

        帧内压缩是生成I帧的算法 。
        帧内压缩,指的是一帧图片的内部压缩。当H.264对图片进行 16 * 16 分块后,会对每个小块内的图像进行分析,如果2个小块图像比较相近,那么住需要存储一张即可,无需存储重复图块。这样可以有效压缩图片的存储大小。
        帧内(Intraframe)压缩的原理是:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩率一般不高。

2.2帧间压缩

        帧间压缩是生成B帧和P帧的算法 。
        帧间压缩 , 指的是图片间的图像压缩。在每帧图片划分成16 * 16 小块的图像进行分析基础上,比图片间的数据,如果两张图片比较相近,对相同的图像模块只需存储一份,对不同的部分再做存储。避免了重复数据的存储,极大改善了图片压缩空间。
        帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。

帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩是无损的,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

3.NALU的类型

        在H.264/AVC中,定义了多种NALU的类型,以适应不同的应用场景。下面是一些常见的类型:

帧内预测(I)
        仅使用当前帧的信息进行编码。也叫帧内压缩,可以通过视频解压算法解压成一张完整的图片,它是一帧画面的完整保留,也被成为关键帧,一般在检测到丢包时,我们会立即向对方强求一个I帧。

预测(P)
        使用前一帧的信息进行编码。也叫帧间压缩,前向预测编码帧,其表示的是这一帧与前一帧的差别,即预测差值与运动矢量。

双向预测(B)
        使用前一帧和后一帧的信息进行编码。双向预测编码帧,记录的是本帧与前后帧的差别,其压缩率较高,但是解码对性能要求较高,一般不使用。

序列参数集(SPS)
        全称Sequence Paramater Set,包含了一组连续图像的编码信息。

图像参数集(PPS)
        全称Picture Paramater Set,包含了一个图像的编码信息。

4.NALU的结构

        每个NALU包含了一个字节大小的NALU头信息(NAL header),以及一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload)。

4.1头部

        头部是NALU的固定部分,占1字节。它包含了以下信息:

禁止位(forbidden_zero_bit)
        1比特,必须为0。

NAL引用指数(nal_ref_idc)
        2比特,表示该NALU的重要性。值越大,重要性越高。解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU,而不影响图像的回放 。 如果当前NALU是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

NAL单元类型(nal_unit_type)
        5比特,表示NALU的类型。例如,类型可以是编码的视频数据、参数集等。

NALU类型的详细解析表 :

常见的NALU类型:

十六进制、二进制    类型        重要性                         类型值
0x67 (0 11 00111)    SPS        非常重要                  type = 7
0x68 (0 11 01000)    PPS       非常重要                  type = 8
0x65 (0 11 00101)    IDR帧    关键帧 非常重要       type = 5
0x61 (0 11 00001)    I帧         非常重要                   type=1非IDR的I帧不大常见
0x41 (0 10 00001)    P帧        重要                          type = 1
0x01 (0 00 00001)    B帧        不重要                      type = 1
0x06 (0 00 00110)    SEI        不重要                       type = 6

分析:以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:

(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型

其中0x67的二进制码为:
        0110 0111
        4-8为00111,转为十进制7,参考第二幅图:7对应序列参数集SPS

其中0x68的二进制码为:
        0110 1000
        4-8为01000,转为十进制8,参考第二幅图:8对应图像参数集PPS

其中0x65的二进制码为:
        0110 0101
        4-8为00101,转为十进制5,参考第二幅图:5对应IDR图像中的片(I帧)

        判断是否为I帧的算法为: (NALU类型  & 0001  1111) = 5   即   NALU类型  & 31 = 5

比如0x65 & 31 = 5

4.2原始字节序列负荷(RBSP,Raw Byte Sequence Payload)

        原始字节序列负荷部分是NALU的可变部分,包含了封装的数据。其内容取决于NALU的类型。

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

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

相关文章

uniapp学习(003-1 vue3学习 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第11p-第p14的内容 文章目录 vue3使用介绍插值表达式例子时间戳随机数输出函数的值 ref响应式数据变量v-bind 绑…

PCL CropBox 过滤给定立方体内的点云数据

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 点云裁剪 2.1.2 可视化原始点云和裁剪后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长…

Python办公自动化案例:批量修改Word文件中的段落格式

案例:Python实现批量修改Word文件中的段落格式。 在处理大量Word文档时,经常需要批量修改这些文档的格式,比如统一段落格式,以提升文档的一致性和专业性。使用Python来实现这一任务可以极大地提高工作效率,特别是当涉及到数百或数千个文档时。Python通过第三方库如python…

【C#】CacheManager:高效的 .NET 缓存管理库

在现代应用开发中,缓存是提升性能和降低数据库负载的重要技术手段。无论是 Web 应用、桌面应用还是移动应用,缓存都能够帮助减少重复的数据查询和处理,从而提高系统的响应速度。然而,管理缓存并不简单,尤其是当你需要处…

《RabbitMQ篇》Centos7安装RabbitMQ

安装RabbitMQ 安装包网盘下载地址 链接:https://pan.baidu.com/s/1bG_nP0iCdAejkctFp1QztQ?pwd4mlw 先上传安装包到服务器(erlang-23.3.4.11-1.el7.x86_64.rpm和rabbitmq-server-3.9.16-1.el7.noarch.rpm)然后使用指令安装 # 安装 erlang r…

掌握 JVM 垃圾收集线程:简化 VM 选项

垃圾收集阶段对于任何 Java 应用程序都至关重要。主要目标是保持高吞吐量和低延迟之间的平衡。通过配置垃圾收集器,我们可以提高性能,或者至少推动应用程序朝着特定的方向发展。 垃圾收集周期越短越好。因此,分配给垃圾收集器的资源越多&…

昇思MindSpore进阶教程--下沉模式

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 正文开始 昇腾芯片集成了AICORE和AICPU等…

C#自定义工具类-数组工具类

目录 数组工具类基本操作 1.排序:升序,降序 2.查找 1)查找最值:最大值,最小值 2)查找满足条件的单个对象 3)查找满足条件的所有对象 4)选取数组中所有对象的某一字段 完整代…

河南做网站与SEO:如何提升搜索引擎排名

河南做网站与SEO:如何提升搜索引擎排名 在当今数字化时代,越来越多的企业意识到互联网的重要性,特别是在河南这样一个快速发展的地区,建立一个优秀的网站已经成为企业发展的必要条件。而在建立网站的同时,SEO&#xff…

--- java数据结构 map set ---

java中map 和 set的底层实现是通过搜索树和哈希函桶来实现 搜索树 二叉搜索树有叫二叉排序树 他具有以下的特点 若存在左节点,那么他左节点的值一定小于根节点 若存在右节点,那么他右节点的值一定大于根节点 它的左右子树也是搜索树 对他进行中序…

leetcode热题100.最长公共子序列

题目 1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原…

SOMEIP_ETS_143: SD_Request_non_existing_ServiceID

测试目的: 验证DUT能够拒绝一个请求不存在的服务ID(ServiceID)的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个请求不存在服务ID的Subs…

RS485串口通信:【图文详讲】

RS485,RS的意义为Recommended Standard的缩写,也就是推荐标准,是一种常用的半双工-异步-串行通信总线。半双工的意思就是两者通信时,同一时刻,只能由其中一方发送,另一方只能接收,不可以同时收发…

vue3 antdv3/4 Modal显示一个提示,内容换行显示。

1、官网地址: Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、显示个信息: Modal.info({title: This is a notification message,content: h(div, {}, [h(p, some messages...some messages...),h(p, some …

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息: 论文题目:基于解压缩模块的JPEG同步重压缩检测 作者:王金伟1 ,胡冰涛1 ,张家伟1 ,马 宾2 ,罗向阳3 (1.南京信息工程大学计算机学院、网络空间安全学院&#xf…

Linux-L11-查看本机ip地址

linux查看ip地址 查看自己的IP地址使用 ip 命令:使用 ifconfig 命令使用 hostname 命令:使用 nmcli 命令 查看某个特定接口的IP查看公网IP地址 在Linux系统中,查看自己的IP地址可以通过多种方式实现,这里提供几种常用的方法&#…

Stable Diffusion绘画 | LCM模型:实现秒出图

在过往,不管使用 SD 还是 MJ,生成一张图片起码要等上10秒。 而现在,有了 LCM 技术的加持,已经能做到秒出图,甚至是实时出图。 LCM(潜空间一致性模型) 是由 清华大学信息科学技术研究院 研发的大模型,它最…

鸿蒙 如何退出 APP

terminateSelf() 停止Ability自身 在EntryAbility中这么使用 this.context.terminateSelf()在Pages页面中这么使用 import { common } from kit.AbilityKit (getContext(this) as common.UIAbilityContext)?.terminateSelf() 也可以直接封装: import common f…

【GreenHills】GHS的Run-Time检查功能

【更多软件使用问题请点击亿道电子官方网站】 一、文档背景 在编写代码时,内存检查的重要性不容忽视。内存是程序运行的核心资源之一,负责存储程序运行所需的数据。由于内存资源的有限性和操作的复杂性,内存错误常常会直接导致程序崩溃、性…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的Swin Transformer

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 模型简介 模型背景 Swin Transfromer在2021年首次发表于论文《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》,目前已用于图像分割、分类等计算机视觉领域的各项任务…