H.264——解析NAL Unit数据

article/2025/9/28 0:25:30

目录

  • 原理
  • 分析
  • 代码实现
    • .c
    • .h
  • 效果

原理

视频编解码——NAL Unit结构分析

分析

  • 1、首先去掉起始码得到NALU实际数据
  • 2、分离出NALU中一个字节的header
    • 1bit禁止位、2bitNRI、5bitTYPE
  • 3、解析剩余NALU的body部分
    • EBSP去除03->RBSP

代码实现

.c

#include "LUX_TEST_Get264.h"LUX_OSD_DataPoint dataPoint;
LUX_OSD_FilePoint filePoint;
int offset = 0;/*** @description: 初始化* @param [in] void* @return */
int LUX_TEST_Init(void)
{int ret = LUX_SUCCESS;int len = 0;do{/*打开264文件*/filePoint.h264File = fopen(LUX_TEST_File, "r");if (NULL == filePoint.h264File){printf("fopen h264file failed\n");perror("why");ret = LUX_FAILED;break;}dataPoint.h264Data = malloc(LUX_TEST_FileSpace);if (NULL == dataPoint.h264Data){printf("malloc dataPoint.h264Data failed\n");perror("why");ret = LUX_FAILED;break;}/*存放h264实际数据*/filePoint.saveH264 = fopen(LUX_TEST_DestFile,"w+"); if(NULL == filePoint.saveH264){printf("fopen LUX_FONT_WRITE_FILE failed\n");}/*读入内存*/len = fread(dataPoint.h264Data, 1, LUX_TEST_FileSpace, filePoint.h264File);if (0 == len){printf("fread dataPoint.h264Data failed\n");perror("why");ret = LUX_FAILED;break;}}while(0);return ret;
}/*** @description: 抓取h264数据并存储* @param [in] void* @return */
int LUX_TEST_Get264Data(void)
{int ret = LUX_SUCCESS;int getDataOffset = 0;int len = 0;do{while(1){if (*(dataPoint.h264Data + offset) == 0 && *(dataPoint.h264Data + offset + 1) == 0){if (*(dataPoint.h264Data + offset + 2) == 1){/*0x 00 00 01*///TODObreak;}else if (*(dataPoint.h264Data + offset + 2) == 0 && *(dataPoint.h264Data + offset + 3) == 1){/*0x 00 00 00 01*/do{getDataOffset++;len = fwrite(dataPoint.h264Data + offset + 3 + getDataOffset, 1, 1, filePoint.saveH264);if (len <= 0){printf("fwrite dataPoint.h264Data failed\n");perror("why");return LUX_FAILED;}if (*(dataPoint.h264Data + 3 + getDataOffset + 1) == 0 && *(dataPoint.h264Data + 3 + getDataOffset + 2) == 0 && *(dataPoint.h264Data + 3 + getDataOffset + 3) == 0 && *(dataPoint.h264Data + 3 + getDataOffset + 4) == 1)break;}while (1);break;}}offset++;}}while(0);fclose(filePoint.saveH264);return ret;
}/*** @description: 解析NALU的header* @param [in] void* @return */
int LUX_TEST_Parise()
{int ret = LUX_SUCCESS;struct stat getSize_ST;int naluSize = 0;int len = 0;char header = 0;char nal_ref_idc = 0;char nal_unit_type = 0;int i = 0;int jugdeTime = 0;int offset = 1;int restore = 0;do{/*获取nalu数据大小*/ret = stat(LUX_TEST_DestFile, &getSize_ST);if (-1 == ret){perror("get file size failed");break;}naluSize = (int)getSize_ST.st_size;/*存放h264数据*/dataPoint.naluData = malloc(naluSize);if (NULL == dataPoint.naluData){printf("malloc dataPoint.naluData failed\n");perror("why");ret = LUX_FAILED;break;}filePoint.saveH264 = fopen(LUX_TEST_DestFile, "r");if (NULL == filePoint.saveH264){printf("fopen saveH264 failed\n");perror("why");ret = LUX_FAILED;break;}len = fread(dataPoint.naluData, 1, naluSize, filePoint.saveH264);if (0 == len){printf("fread dataPoint.naluData failed\n");perror("why");ret = LUX_FAILED;break;}fclose(filePoint.saveH264);/*解析header*/header = *dataPoint.naluData;nal_ref_idc = (header | 0x60) >> 5;nal_unit_type = (header & 0x1f);printf("==================\n");printf("nal_ref_idc   = %x\n",nal_ref_idc);printf("nal_unit_type = %x\n",nal_unit_type);printf("++++++++++++++++++\n");/*解析body*/jugdeTime = naluSize - 3;/*header、003*/for (i = 0; i < jugdeTime; i++){if (*(dataPoint.naluData + offset)     == 0 && *(dataPoint.naluData + offset + 1) == 0 &&*(dataPoint.naluData + offset + 2) == 3){while ((offset + 2 + restore + 1) < jugdeTime){*(dataPoint.naluData + offset + 2 + restore) = *(dataPoint.naluData + offset + 2 + restore + 1);restore++;}break;}elseoffset++;}i = 0;printf("RBSP = ");for (i = 0; i < (naluSize - 1); i++){printf("%x ", *(dataPoint.naluData + 1 + i));i++;}printf("\n==================\n");}while (0);return ret;
}
/*** @description: 去初始化* @param [in] void* @return */
int LUX_TEST_DeInit(void)
{free(dataPoint.h264Data);fclose(filePoint.h264File);}int main()
{int ret = LUX_FAILED;ret = LUX_TEST_Init();if(LUX_FAILED == ret){printf("LUX_TEST_Init error\n");return LUX_FAILED;}ret = LUX_TEST_Get264Data();if(LUX_FAILED == ret){printf("LUX_TEST_Get264Data error\n");return LUX_FAILED;}ret = LUX_TEST_Parise();if(LUX_FAILED == ret){printf("LUX_TEST_Parise error\n");return LUX_FAILED;}ret = LUX_TEST_DeInit();if(LUX_FAILED == ret){printf("LUX_TEST_DeInit error\n");return LUX_FAILED;}return LUX_SUCCESS;
}

.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>#define LUX_TEST_File       "test.264"
#define LUX_TEST_DestFile   "destFile"#define LUX_TEST_FileSpace  0x2040
#define LUX_SUCCESS         0
#define LUX_FAILED          -1typedef struct
{char *h264Data;     //YUVchar *naluData;     //去除起始码分理处的nalu数据
}LUX_OSD_DataPoint;typedef struct
{FILE *h264File;     //打开264FILE *saveH264;     //存h264实际数据
}LUX_OSD_FilePoint;/*** @description: 初始化* @param [in] void* @return */
int LUX_TEST_Init(void);/*** @description: 抓取h264数据并存储* @param [in] void* @return */
int LUX_TEST_Get264Data(void);/*** @description: 解析NALU* @param [in] void* @return */
int LUX_TEST_Parise();/*** @description: 去初始化* @param [in] void* @return */
int LUX_TEST_DeInit(void);

效果

在这里插入图片描述


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

相关文章

H265/HEVC编码NAL的单元的介绍

一、引言 与H.264/AVC 类似&#xff0c;H265/HEVC也采用视频编码层&#xff08;Video Coding Layer&#xff0c;VCL&#xff09;和网络适配层&#xff08;Network Abstract Layer, NAL&#xff09;的双层结构&#xff0c;以适应不同网络环境和视频应用。网络适配层的主要任务是…

六、NAL Unit解析

参考标准文档&#xff1a;7.3和7.4节 一、NAL Unit结构 NAL Unit: NAL Unit NAL Header NAL Body NAL Header&#xff1a;一个字节&#xff0c;包括&#xff1a; forbidden_zero_bit&#xff1a;规定必须为0禁止位&#xff0c;1 bit;nal_ref_idc&#xff1a;第2和3位&#…

VCL和NAL

VCL和NAL 1.VCL只关心编码部分,重点在于编码算法以及特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何冗余头信息。 NAL关心是是VCL的输出纯视频流如何被表达和封包以利于网络传输。 封包目的别人知道怎么传输和解码 (1)SODB:string of Data Bits (2)RBSP…

h264 NAL解析

目录 1 AVCC与Annex-B标准 2 slice 2.1 slice header 3 elecard工具解析示例 H.264标准中&#xff0c;视频流是由NAL(Network Abstraction Layer)单元组成的&#xff08;简称NALU&#xff09;&#xff0c;每个NALU中可能是IDR图像、SPS、PPS、non-IDR图像等。 1 AVCC与Ann…

H264(NAL简介与I帧判断)

http://blog.csdn.net/jefry_xdz/article/details/8461343 1、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中&#xff0c;整个系统框架被分为了两个层面&#xff1a;视频编码层面&#xff08;VCL&#xff09;和网络抽象层面&#xff08;NA…

H.264(NAL简介与I帧判断)

H.264(NAL简介与I帧判断) 1、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中&#xff0c;整个系统框架被分为了两个层面&#xff1a;视频编码层面&#xff08;VCL&#xff09;和网络抽象层面&#xff08;NAL&#xff09;。其中&#xff0c;前者负责…

NAL(网络自适应层)

&#xff08;1&#xff09;整个系统框架被分为了两个层面&#xff1a;视频编码层面&#xff08;VCL&#xff09;和网络抽象层面&#xff08;NAL&#xff09;。其中&#xff0c;前者负责有效表示视频数据的内容&#xff0c;而后者则负责格式化数据并提供头信息&#xff0c;以保证…

H264的NAL解析

一、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中&#xff0c;整个系统框架被分为了两个层面&#xff1a;视频编码层面&#xff08;VCL&#xff09;和网络抽象层面&#xff08;NAL&#xff09;。其中&#xff0c;前者负责有效表示视频数据的内容&…

【Lua】xLua逻辑热更新

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

[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——热更新

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

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

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

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

Xlua

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

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

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

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

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

xLua(九)——实战

一&#xff1a;使用xLua的步骤 ——导入xLua插件 其实xLua本质就是一个Unity工程&#xff0c;把Asset中的文件导入到Unity工程中就搞定了&#xff08;导入之后编辑器菜单栏会扩展出一个XLua选项&#xff09; ——添加宏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的能力&#xff0c;实际多用于热更新。 热更新&#xff0c;因为要给代码打标签才能生效&#xff0c;所以需要预测…

xLua介绍

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