H264 NALU分析

news2024/11/15 12:55:43

标题

  • 1.H264介绍
  • 2.H264编解码解析
    • 2.1. H264编码原理
    • 2.2 H264的I帧,P帧,B帧
    • 2.3 H264编码结构解析
    • 2.4 NALU
    • 2.4.1 NALU结构
    • 2.4.2 解析NALU
    • 2.4.3 annexb模式

1.H264介绍

H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

2.H264编解码解析

2.1. H264编码原理

在音视频传输过程中, 视频文件的传输是一个很大的问题,比如一个1920*1080分辨率的视频, 每个像素为RGB占用3字节,帧率为25的视频,那么对于传输带宽要求为:1920 * 1080 * 3 * 25 / 1024/1024=148.315MB/s,这种网络速率对于我们现在的网络技术是不可取的,因此视频压缩和编码技术应运而生, 对于视频文件来说,视频由单张图片帧组成,而视频一般都是连续的,因此每一帧都有相似性, 视频压缩技术就是用了这一点进行图片压缩.

H264采用了16 * 16的分块大小对,视频帧图像进行像素对比进行压缩编码.
在这里插入图片描述

2.2 H264的I帧,P帧,B帧

H264采取帧内压缩和帧外压缩的方式提高编码速率
H264采用了独特I帧,P帧,B帧策略进行实现连续帧之间的压缩
在这里插入图片描述

如上图所示:

帧的分类中文意义
I帧帧内编码帧I帧通常是每个GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度的压缩,作为随机访问的参考点,可以当成图像. I帧可以看出一个图像经过压缩的产物,因此I帧可以通过自身通过解压算法进行还原成一张完成的图片
P帧前向预测编码帧通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。需要参考前面的I帧或者P帧来生成一张完整的图片
B帧双向预测帧既要考虑前面的帧,又要考虑后面的帧,已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。参考前一个I帧或者P帧及后一个P帧或者I帧来生成一张完整的图片

压缩率: B>P>I

2.3 H264编码结构解析

H264除了实现了视频压缩之外,为了网络传输还提供了对应的视频编码及分片策略;类似网络数据封装成IP帧一样,在H264中将其称为组(GOP,group of pictures),片(slice),宏块(Macroblock)这些⼀起组成了H264的码流分层结构.
H264将其组织成为序列(GOP)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock)五个层次。
GOP (图像组)主要⽤作形容⼀个IDR帧 到下⼀个IDR帧之间的间隔了多少个帧。
在这里插入图片描述
H264将视频分为连续的帧进⾏传输,在连续的帧之间使⽤I帧、P帧和B帧。同时对于帧内⽽⾔,将图像分块为⽚、宏块和字块进⾏分⽚传输;通过这个过程实现对视频⽂件的压缩包装。

IDR(Instantaneous Decoding Refresh,即时解码刷新)
一个序列的第一个图像叫做IDR帧,IDR帧一定是I帧,但是I帧不一定是IDR帧,由于P帧和B帧还原时需要其他帧,因此在解压出图像时,之前还原的图像还要存放在一个队列中,但是并不是所有图像解压后一直都放在队列中的,当遇到IDR帧后之前的队列就要清空一下,这样如果前一个序列遇到重大错误,后面的帧都不会受到影响.
在这里插入图片描述

2.4 NALU

在这里插入图片描述

  • SPS:序列参数集,SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。
  • PPS:图像参数集,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。
  • I帧:帧内编码帧,可独⽴解码⽣成完整的图⽚。
  • P帧: 前向预测编码帧,需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。
  • B帧: 双向预测内插编码帧,则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。
  • 发I帧之前,⾄少要发⼀次SPS和PPS。

2.4.1 NALU结构

H.264裸流是由一个个NALU组成的,他的功能分为两层,VCL(视频编码层)和NAL(网络提取层):

  • VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能独立于网络进行高效编码.
  • NAL:负责将VCL产生的比特字符串适配各种网络环境和多元环境中,覆盖了所有片级以上语法.

在VCL在进行数据传输或者存储之前,这些编码的VCL数据需要映射到或者封装到NAL单元中(NALU)

一个NALU=一组NALU头部信息+一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload).

NALU结构单元的主体结构如下:一个原始的H264原始单元通常由[StartCode][NALUHeader][NALU Payload]三部分组成,其中StartCode 用于标识一个NALU单元的开始,必须是"00 00 00 01"或者"00 00 01",除此之外基本上相当于NALU Header+ RBSP
在这里插入图片描述
对于FFmpeg来说,MP4文件解复用后的packet是不带startcode的,但是TS文件读取出来的packet是带startcode的

2.4.2 解析NALU

每个NALU单元一个一定语法元素的可变字节长字符串,包括一个字节的头信息(用来表示数据类型),以及若干负荷数据.
在这里插入图片描述
其中:

  • T为负荷数据类型,占用5bit
  • nal_unit_type:这个NALU单元的类型,1~12 由H.264使⽤,24~31由H.264以外的应⽤使⽤

  • R为重要指标,占用2bit
  • nal_ref_idc.:取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它⽽不影响图像的回放,0~3,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的⽚,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需⼤于0。

  • F作为禁止位,占1bit
  • forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0

nal_unit_typeNAL 单元和 RBSP 语法结构的内容
0未指定
1⼀个⾮IDR图像的编码条带slice_layer_without_partitioning_rbsp( )
2编码条带数据分割块A slice_data_partition_a_layer_rbsp()
3编码条带数据分割块B slice_data_partition_b_layer_rbsp( )
4编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
5IDR图像的编码条带(片) slice_layer_without_partitioning_rbsp( )
6辅助增强信息 (SEI)sei_rbsp( )
7序列参数集 seq_parameter_set_rbsp( )
8图像参数集 pic_parameter_set_rbsp( )
9访问单元分隔符 access_unit_delimiter_rbsp( )
10序列结尾 end_of_seq_rbsp( )
11流结尾
12填充数据
13序列参数集扩展

2.4.3 annexb模式

h264一共有2中封装格式:

  • 一种是annexb模式,传统模式,有startcode,SPS和PPS,在ES中
  • 一种是mp4模式,一般mp4,mkv都是mp4模式,没有startcode,SPS和PPS以及其他信息,是被封装在container中,每一个frame前面4字节是这个frame的长度

一般解码器只支持annexb模式,因此需要将mp4做转换,在ffmpeg中使用h264_mp4toannexb_filter
在这里插入图片描述

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

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

相关文章

Ansible Playbook

Ansible 的脚本 --- playbook 剧本 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables:变量 (3&…

Postman接口测试之:添加Cookie伪造请求

1,获取cookie值 登录某网站,通过开发者工具(或者fiddler抓包工具),获取登录成功后的请求头中的cookie值。 大家肯定奇怪,明明访问首页的时候就已经生成了cookie值,为什么还登录呢?…

Linux中磁盘管理之格式化、分区、挂载-详解

今天给大家介绍一下Linux中磁盘管理中格式化、分区、挂载等操作步骤,希望这篇文章对大家有所帮助。 一、磁盘知识 1.磁盘含义 磁盘(Disk)是一种用于存储和读取数据的物理设备,它由一个或多个旋转的磁性盘片组成。这些盘片通常由…

递归算法学习

递归算法介绍 递归指的是函数或算法在执行过程中调用自身。在递归的过程中,程序会不断地将自身的执行过程压入调用栈中,直到满足某个条件结束递归调用并开始返回。递归算法常用于解决一些具有递归结构的问题,比如树、图、排序等。递归算法可以…

5.controller部署nova服务

nova 服务是 OpenStack service 计算服务,负责维护和管理云环境的计算资源; 例如: 接收客户端请求需要的计算资源; 确定实例在哪个物理机上创建; 通过虚机化的方式将实例启动运行等工作。 controller节点 在安装和配…

JAVA为什么要面向对象

JAVA是一个面向对象的语言 ok,我们开始,用了那么久的java,看了那么多代码,你是否懂得了面向对象,今天我们的第一个问题就是,为什么java要面向对象,要解释为啥要面向对象,我们首先要…

Python selenium自动化测试模型图解

1、线性测试 优势:每一个脚本都是完整独立的,每一个脚本对应一个测试用例 缺点:开发成本高,会有重复操作重复脚本;维护成本也高,修改重复操作的脚本时,要逐一进行修改。 2、模块化驱动测试 …

2023年计算机专业毕业实习报告最新

2023年计算机专业毕业实习报告最新篇1 一、实习基本情况 按照学校对毕业生的要求,为毕业后的工作和谋职打下良好的基础。我于X年X月来到山西柳林汇丰兴业同德焦煤有限公司进行为期X个月的实习。毕业实习让我们想起那句老话:“让学生赢在起跑线上。”在学…

验证性实验 - 线性回归

练习1:线性回归 介绍 在本练习中,您将实现线性回归并了解其在数据上的工作原理。 在开始练习前,需要下载如下的文件进行数据上传: ex1data1.txt -单变量的线性回归数据集ex1data2.txt -多变量的线性回归数据集 在整个练习中&a…

马斯克撕下美国的遮羞布,美企纷纷背刺,外媒:可怕的还在后面

马斯克访华造成的影响还在持续,随着更多美国企业家访华以及表明态度,可以说他们正撕下美国的遮羞布,今天的美国其实早已背离了当初他们所宣扬的价值,凸显出外强中干的本质。 二.美国企业家纷纷访华撕下美国遮羞布 美国一直都标榜贸…

某购房通小程序解密分析【2023.6.17】

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 主要对小程序返回的加密结果进行解密的分析过程只…

如何在编程中中实现负载均衡和容错处理

什么是容错 容错是指系统(计算机、网络、云集群等)在其一个或多个组件发生故障时继续运行而不会中断的能力。 创建容错系统的目的是防止由单点故障引起的中断,确保任务关键型应用程序或系统的高可用性和业务连续性。 容错系统使用备份组件…

DAY26:回溯算法(一):回溯算法理论

课程链接:https://www.bilibili.com/video/BV1cy4y167mM/?spm_id_from333.788 什么是回溯法 回溯法 - OI Wiki (oi-wiki.org) 回溯法是一种经常被用在 深度优先搜索(DFS) 和 广度优先搜索(BFS) 的技巧。 其本质是…

Elasticsearch 基本使用(一)写入数据

写入数据 查询索引状态写入一条数据查询数据按id查询一条 类比 getById不按id查 写入官方测试数据 查询索引状态 GET _cat/indices写入一条数据 PUT/POST my_index/_doc/1 {"k": "test key" }my_index:索引名 _doc:文档类型&#…

css基础知识三:说说em/px/rem/vh/vw的区别?

一、介绍 传统的项目开发中,我们只会用到px、%、em这几个单位,它可以适用于大部分的项目开发,且拥有比较良好的兼容性 从CSS3开始,浏览器对计量单位的支持又提升到了另外一个境界,新增了rem、vh、vw、vm等一些新的计量…

2023年网络安全竞赛——网页渗透

网页渗透 任务环境说明:  服务器场景:Server2120  服务器场景操作系统:未知(封闭靶机)  用户名:未知 密码:未知 访问服务器的网站主页,猜测后台数据库中本网页中应用的库名称长度,将长度作为flag提交; 通过扫描发现靶机开放80端口,直接访问80 尝试输入一个1,…

Web安全信息收集之CMS指纹识别

1、CMS指纹识别 CMS(内容管理系统),又称整站系统或文章系统网站内容管理。用户只需要下载对应的CMS软 件包,部署搭建,就可以直接利用CMS,简单方便。但是各种CMS都具有其独特的结构命名规则和定 的文件内容,因此可以利用这些内容来获取CMS站点的具体软件CMS与版本 常见CMs: …

软件管理Linux

1. 获取程序包的途径 系统发行版的光盘或官方的服务器 http://mirrors.aliyun.comhttp://mirrors.sohu.comhttp://mirrors.163.com 项目官方站点第三方组织 Fedora-EPEL(推荐)搜索引擎: http://pkgs.org http://rpmfind.net http://rpm.pbon…

数据库第十章(数据库恢复技术)十一章(并发控制)

目录 1.事务 2.并发控制 1.事务 事务的特点:ACID 原子性 atom 一致性 consistent 隔离性 isolation 持久性 durable 故障的种类 1.事务内部故障 措施:采取redo重做和undo撤销技术 2.系统故障DBMS 措施:重启 3.介质故障 硬件损坏 4.计…

msvcr110.dll丢失的解决方法-dll一键下载修复

我们在运行软件程序或者游戏的时候,如果程序提示“无法启动此程序,因为计算机中丢失msvcr110.dll。尝试重新安装该程序以解决此问题”,如果说明您电脑系统中缺少或者未注册msvcr110.dll这个运行库文件,那么我们要如何解决这个问题…