音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
=================================================================
音视频入门基础:H.264专题系列文章:
音视频入门基础:H.264专题(1)——H.264官方文档下载
音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介
音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现
音视频入门基础:H.264专题(8)——H.264官方文档的描述符
=================================================================
一、引言
FFmpeg源码中 通过h264_parse_nal_header函数将H.264码流的NALU Header解析出来。下面对h264_parse_nal_header函数进行分析。
二、h264_parse_nal_header函数定义
h264_parse_nal_header函数定义在FFmpeg源码(下面演示的FFmpeg源码版本是5.0.3)的源文件libavcodec/h2645_parse.c 中:
static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
{GetBitContext *gb = &nal->gb;if (get_bits1(gb) != 0)return AVERROR_INVALIDDATA;nal->ref_idc = get_bits(gb, 2);nal->type = get_bits(gb, 5);av_log(logctx, AV_LOG_DEBUG,"nal_unit_type: %d(%s), nal_ref_idc: %d\n",nal->type, h264_nal_unit_name(nal->type), nal->ref_idc);return 0;
}
该函数作用是:将NALU Header解析出来,由形参nal返回。
形参nal:
nal->gb:输入型参数。(&(nal->gb))->buffer指向存放NALU Header + RBSP 的缓冲区。
nal->ref_idc:输出型参数。执行h264_parse_nal_header函数后,nal->ref_idc的值为NALU Header中的nal_ref_idc。
nal->type:输出型参数。执行h264_parse_nal_header函数后,nal->type的值为NALU Header中的nal_unit_type。
形参logctx:输入型参数。用来输出日志,可以忽略。
返回值:解析NALU Header成功返回0。失败返回AVERROR_INVALIDDATA。
三、h264_parse_nal_header函数的内部实现原理
h264_parse_nal_header函数中,首先通过语句get_bits1(gb);拿到NALU Header中forbidden_zero_bit。关于get_bits1用法可以参考:《FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析》。
由于forbidden_zero_bit 的值应为0,如果它的值为1,则意味着比特流语法出错了,也就是FFmpeg头文件libavutil/error.h里面定义的“Invalid data found when processing input”:
#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input
所以如果forbidden_zero_bit的值不为0,返回AVERROR_INVALIDDATA。
所以有下面语句:
if (get_bits1(gb) != 0)return AVERROR_INVALIDDATA;
然后通过下面语句,读取NALU Header中的nal_ref_idc和nal_unit_type,分别保存到nal->ref_idc和nal->type中。
nal->ref_idc = get_bits(gb, 2);
nal->type = get_bits(gb, 5);
最后通过
av_log(logctx, AV_LOG_DEBUG,"nal_unit_type: %d(%s), nal_ref_idc: %d\n",nal->type, h264_nal_unit_name(nal->type), nal->ref_idc);
日志输出NALU Header的信息。
h264_nal_unit_name函数是用来得到nal_unit_type的名称。其定义如下:
static const char *const h264_nal_type_name[32] = {"Unspecified 0", //H264_NAL_UNSPECIFIED"Coded slice of a non-IDR picture", // H264_NAL_SLICE"Coded slice data partition A", // H264_NAL_DPA"Coded slice data partition B", // H264_NAL_DPB"Coded slice data partition C", // H264_NAL_DPC"IDR", // H264_NAL_IDR_SLICE"SEI", // H264_NAL_SEI"SPS", // H264_NAL_SPS"PPS", // H264_NAL_PPS"AUD", // H264_NAL_AUD"End of sequence", // H264_NAL_END_SEQUENCE"End of stream", // H264_NAL_END_STREAM"Filler data", // H264_NAL_FILLER_DATA"SPS extension", // H264_NAL_SPS_EXT"Prefix", // H264_NAL_PREFIX"Subset SPS", // H264_NAL_SUB_SPS"Depth parameter set", // H264_NAL_DPS"Reserved 17", // H264_NAL_RESERVED17"Reserved 18", // H264_NAL_RESERVED18"Auxiliary coded picture without partitioning", // H264_NAL_AUXILIARY_SLICE"Slice extension", // H264_NAL_EXTEN_SLICE"Slice extension for a depth view or a 3D-AVC texture view", // H264_NAL_DEPTH_EXTEN_SLICE"Reserved 22", // H264_NAL_RESERVED22"Reserved 23", // H264_NAL_RESERVED23"Unspecified 24", // H264_NAL_UNSPECIFIED24"Unspecified 25", // H264_NAL_UNSPECIFIED25"Unspecified 26", // H264_NAL_UNSPECIFIED26"Unspecified 27", // H264_NAL_UNSPECIFIED27"Unspecified 28", // H264_NAL_UNSPECIFIED28"Unspecified 29", // H264_NAL_UNSPECIFIED29"Unspecified 30", // H264_NAL_UNSPECIFIED30"Unspecified 31", // H264_NAL_UNSPECIFIED31
};static const char *h264_nal_unit_name(int nal_type)
{av_assert0(nal_type >= 0 && nal_type < 32);return h264_nal_type_name[nal_type];
}
可以看到h264_nal_unit_name函数内部通过nal_unit_type拿到数组h264_nal_type_name中对应的字符串(名称)。
h264_nal_type_name数组跟H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第65页描述的nal_unit_type对应:
相关文章:

音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

RT-Thread ENV-Windows v2.0.0安装教程
前言 前几天RT-Thread官方更新了env工具,开源仓库的Kconfig的写法都不大一样了;如果继续用原来的env工具,拉新代码之后很多示例都编译不了 在最新的env工具中menuconfig全面采用kconfiglib,升级env脚本和python版本,改…...

[HBM] HBM TSV (Through Silicon Via) 结构与工艺
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 全文 3300 字。 1 概念 1.1 什么是HBM TSV 使用 TSV 堆叠多个DDR DRAM成为一块HBM, 成倍提高了存储器位宽, 一条位宽相当于高速公路的一条车道, 车道越多ÿ…...

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统
一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统,该系统通过DHT11温湿度传感器采集环境中的温湿度数据,并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示,通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…...

【Qt+opencv】编译、配置opencv
文章目录 前言下载opencv编译opencvmingw版本 总结 前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它包含了超过2500个优化的算法。这些算法可以用来检测和识别面部,识别对象&#x…...

RDMA建链的3次握手和断链的4次挥手流程?
文章目录 基础信息建链 3次握手断链4次挥手建联状态active端passive端 报文结构函数关系其他后记 基础信息 CM: Communication Management 通信管理 连接管理SIDR: Service ID Resolution Protocol. 作用: enables users of Unreliable Datagram service to locate …...

实验4 图像空间滤波
1. 实验目的 ①掌握图像空间滤波的主要原理与方法; ②掌握图像边缘提取的主要原理和方法; ③了解空间滤波在图像处理和机器学习中的应用。 2. 实验内容 ①调用 Matlab / Python OpenCV中的函数,实现均值滤波、高斯滤波、中值滤波等。 ②调…...

独辟蹊径:我是如何用Java自创一套工作流引擎的(下)
作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇:独辟蹊径:我是如何用Java自创一套工作流引擎的(上)_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中,我们详细介绍了如何利用Java语言从…...
【Python】pycharm常用快捷键操作
目录 一.pycharm自定义修改快捷键 二.pycharm默认常用快捷键 一.pycharm自定义修改快捷键 在file-setting-keymap中可以修改快捷键,建议刚开始没特殊需求就不用修改,先熟悉系统默认的常用快捷键,但是以下情况可以考虑修改: 之前使用其他I…...
es6语法复习一
es6语法 1.var 变量提升 2.let 不存在变量提升,只能定义一次 3.const 先定义再使用,定义好来不能修改 4.解构赋值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.对象简化写法 const school{ name, change, improve(){ cons…...
【python入门】自定义函数
文章目录 定义自定义函数的基本语法参数类型示例代码函数作用域匿名函数(Lambda)闭包装饰器 Python中的自定义函数允许你编写一段可重用的代码块,这段代码可以带参数(输入),并可能返回一个值(输…...

ONLYOFFICE 桌面编辑器 8.1 版发布:全面提升文档处理效率的新体验
文章目录 什么是ONLYOFFICE ?ONLYOFFICE 桌面编辑器 8.1 发布:新功能和改进功能强大的 PDF 编辑器幻灯片版式功能从右至左语言支持多媒体功能增强无缝切换工作模式其他改进和优化总结 什么是ONLYOFFICE ? https://www.onlyoffice.com/zh/off…...

ESP32实现UDP连接——micropython版本
代码: import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…...

Windows Ternimal
Windows Ternimal 安装 Windows 终端概述 | Microsoft Learn wt --help在当前目录打开 lextm/windowsterminal-shell: Install/uninstall scripts for Windows Terminal context menu items 打开指定目录 wt -d %USERPROFILE% ohmyposh 美化 1 安装 2 添加 ohmyposh bin…...

Unity扩展编辑器功能的特性
1.添加分组标题 用于在Unity的Inspector视图中为属性或变量组创建一个自定义的标题或头部,有助于在Inspector中组织和分类不同的属性,使其更易于阅读和管理。 [Header("Common Properties")] public float MouseSensitivity 5; public float…...
API类别 - UI核心
API类别 - UI核心 引言 在当今的数字时代,用户界面(UI)是任何软件或应用成功的关键因素之一。UI核心API作为构建用户界面的基础,提供了丰富的功能和工具,使得开发者能够创建出既美观又实用的用户界面。本文将深入探讨UI核心API的不同类别,以及它们如何影响现代软件开发…...

Redis-主从复制-配置主从关系
文章目录 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录2、修改protected-mode 为no,取消保护模式3、查看redis的进程状态4、配置6380是6379的从机5、配置6381是6379的从机6、查看主机 6379 的主从信息 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录 …...

DigiRL:让 AI 自己学会控制手机
类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令,不同的是它利用了离线到在线强化学习(Offline-to-Online RL),能够快速适应应用更新或 UI 变化。...

04.Ambari自定义服务开发-自定义服务配置文件在Ambari中的设置方法
文章目录 设置方法配置文件设置Custom xxx配置文件详细的配置方法.xml文件的整体格式基础参数格式value-attributes配置介绍设置属性在服务安装后不可修改设置允许字段为空是否显示配置名称参数类型设置字符串类型PasswordBooleanIntFloatDirectoryDirectoriesContent-多行文本…...

LSTM时间序列基础学习
时间序列 时间序列可以是一维,二维,三维甚至更高维度的数据,在深度学习的世界中常见的是三维时间序列,这三个维度分别是(batch_size,time_step,input_dimensions)。 其中time_step是时间步,它…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...