H264的NAL解析

article/2025/9/28 0:54:20

一、NAL全称Network Abstract Layer, 即网络抽象层。

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

一段h.264的码流通常是由多个GOP组成的,GOP内一般包含1sps+1pps+1sei+1I帧+若干p帧(加上B帧一共有6种单元结构)。

二、结构单元介绍
1、sps(序列参数集)
 (1)序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数,所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中

(2)里面包含宏块编码方式、图像大小尺寸、宏块个数,播放器通过这些参数,调用播放器里面的对应算法去解码

2、pps(图像参数集)

(1)H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)

3、SEI

(1)也是一些图像的额外信息,帮助播放器解析压缩图像

4、I帧、P帧、B帧
(1)I帧是关键,丢了I帧当前sequence就废了,每个sequence有且只有1个I帧

(2)帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面),I帧大,说明本身压缩比不高,图像数据更完整,则P帧可以越小,反之I帧越小则P帧会越大

(3)P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

(4)B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别
 

三、实战分析一帧(I帧)

        下面分析一个I帧的数据(其实不止I帧,这里包含了sps、pps、I帧,因为通常情况下,这三货是哐哐很快地一起编码过来的,就保存在一起了,判断是sps即可认为是I帧):

 1、分隔符

        红色框框的,H.264在编码的时候,生成一个序列时,序列中每个单元前面就会加上00 00 00 01作为分隔符

2、分隔符后第一个字节(绿色框框的)

分隔符后面紧跟着的第一个字节就是用来判断是什么类型的单元,详情如下:

          1)第1位禁止位,值为1表示语法出错
          2)第2~3位为参考级别
          3)第4~8为是nal单元类型(比如是0x67(取5位00111表示sps)
 

NAL 单元中的 RBSP 数据结构的类型,Nal 单元类型码,如下所示:

Nal_ref_type

内容

0

未指定

1

不分区,非IDR图像的片

2

片分区A

3

片分区B

4

片分区C

5

IDR图像中的片

6

辅助增强信息 (SEI)

7

SPS 序列参数集

8

PPS 图像参数集

9

访问单元分隔符AUD

10

序列结束

11

流结尾

12

填充数据

13

序列参数集扩展

14....18

保留

19

未分割的辅助编码图像的编码条带

20...23

保留

24...31

未指定

其中1~12由H.264使用,24~31由H.264以外的应用使用。只需要记得常用的sps、pps、I帧、p帧对应的数值就好。

3、绿色框框后面紧跟着的就是该结构单元的实际数据了,0x27后面的即为sps的实际内容,0x28后面即为pps的内容,0x25后面才真真正正的I帧的数据(也有人把这三合在一起叫I帧)。


http://chatgpt.dhexx.cn/article/ime20aQc.shtml

相关文章

【Lua】xLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系,ToLua逻辑热更新 中介绍了 ToLua 的应用,本文将进一步介绍 Unity3D 中基于 xLua 实现逻辑热更新。 逻辑热更新是指:在保持程序正常运行的情况下,在后台修改代码逻辑,修…

[Unity实战]一个好用的lua/xlua/tolua/slua调试工具vscode-luaide-lite插件 好用到飞起..[Unity-Debug+Xlua-Debug][开箱可用]

[Unity实战]一个好用的lua调试工具vscode-luaide-lite插件 好用到飞起..[Debug][开箱可用][xlua] 简介官方例子:xlua/tolua/slua/lua5.1等1.安装2.配置3.使用3.1启动unity3.2vscode-debug:Unity Editor3.3vscode-debug:3.4运行unity进入断点... 4.核心代码:5.github地址 简介 l…

XLua——热更新

什么是热更新? 游戏上线后,出现游戏Bug或者需要更新小版本内容,游戏如果没有做热更新支持的话,就需要重重新打包游戏,然后上传平台进行审核,审核通过后玩家才可以下载新版本。审核期间需要时间,…

通过Xlua插件运行lua程序

using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; //引入xlua命名空间 public class Creat : MonoBehaviour {private LuaEnv luaenv;void Start(){luaenv new LuaEnv(); //LuaEnv可以理解为lua的运行环境luaenv.DoString("…

xlua基础知识

1.1 xLua简介 xLua是由腾讯维护的一个开源项目,xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性…

[Unity XLua]热更新XLua入门(一)-基础篇

无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中&…

Xlua

有一个项目做完快上线了,不是lua写的,能热更新的东西就特别少,如果遇到bug也很难在第一时间热修复,所以我就接入了Xlua这个插件点击打开链接 原本只是想热修复一下的,后来领导要求把逻辑系统的C#代码全部换成了Lua,至于为什么,因为他们习惯了每天都更新和修改的开发模式...所以…

xLua热更新(二)实现热更新

一、环境配置 要实现热更新功能,我们首先需要开启热更新的宏。操作方法是在「File->Build Settings->Player Settings->Player->Other Settings->Scripting Define Symbols」选项中添加HOTFIX_ENABLE 开启后,在xLua的菜单中就出现了「…

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬…

xLua(九)——实战

一:使用xLua的步骤 ——导入xLua插件 其实xLua本质就是一个Unity工程,把Asset中的文件导入到Unity工程中就搞定了(导入之后编辑器菜单栏会扩展出一个XLua选项) ——添加宏File——Build Settings——Player Settings——Other Se…

【XLua】简单使用

文章目录 前言1 配置1.1 配置宏1.2 XLua配置 2 lua和C#相互调用2.1 XLua.CSharpCallLua2.2 XLua.LuaCallCSharp 3 加载器 前言 XLua本质上是为Unity提供了使用lua的能力,实际多用于热更新。 热更新,因为要给代码打标签才能生效,所以需要预测…

xLua介绍

xLua地址:传送门 Xlua是啥? 2016年 腾讯推出的 一种 unity下 lua 编成的解决方案 基本概念介绍: 1.模块 模块就是一个 程序库,可以通过 require 加载,得到了一个表示 table的全局变量 这个table 就像一个命名空间&am…

Lua快速入门篇(XLua教程)(Yanlz+热更新+xLua+配置+热补丁+第三方库+API+二次开发+常见问题+示例参考)

《Lua热更新》 ##《Lua热更新》发布说明: “Lua热更新”开始了,立钻哥哥终于开始此部分的探索了。 作为游戏发布迭代的重要技术:Lua热更新在网络游戏迭代更新中非常重要,特别是对于AppStore这样的平台,我们只需要定…

XLua加载

XLua加载lua文件的方式 LuaEnv.DoString(print("hello world")); //直接执行lua的语句,在函数体内的语句格式要符合lua的语法 LuaEnv.DoString("require byfile")//使用require lua文件名也可在unity中加载lua 但是在unity中需要把文件放置在…

XLua系列讲解_Helloworld

一、XLua简介 XLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。 二、Xlua的优点 简洁易用,容易上手可…

Unity XLua Hotfix热更新配置笔记

Unity XLUA Hotfix热更新配置笔记 目录 Unity XLUA Hotfix热更新配置笔记 配置热更新步骤: 下载XLUA下载压缩包解压 复制xlua 和plugins到assets开启热补丁特性 先添加宏 HOTFIX_ENABLE;INJECT_WITHOUT_TOOL报“This delegate/interface must add to CSharpCallLu…

xLua热更新(一)xLua基本使用

一、什么是xLua xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 xLua是用来实现Lua代码与C#代码相互调用的插件。我们可以借助这个插件来实现热更新方案。 那么为什么要选择Lua实现热更新呢&am…

Bug-CTF-秋名山老司机(正则匹配)

题目: 没有啥思路,意外地刷新了一下页面,发现数值变化了 再刷新一次试试,出来一个提示,大概意思是需要提交结果,这里也不知道该怎么传参,也不晓得怎么写这个脚本,只能参考其他大佬的思路了 解题…

BUGKU------秋名山老司机

看到这个就直接上python吧,用eval计算子式 import requests from bs4 import BeautifulSoup r requests.session() s r.get(http://123.206.87.240:8002/qiumingshan/) soup BeautifulSoup(s.text, "html.parser") a soup.find(div) d {"valu…

bugku秋名山车神

不断的刷新&#xff0c;发现表达式一直在变换&#xff0c;这种必须写脚本&#xff0c;才能跟上速度。直接上代码 import re import requests srequests.session() rs.get("http://123.206.87.240:8002/qiumingshan/") searchObj re.search(r^<div>(.*)\?;<…