当前位置: 首页 > news >正文

音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现

一、引言 

从《音视频入门基础:H.264专题(18)——AVCDecoderConfigurationRecord简介》中可以知道,avcC跟AnnexB不一样,avcC包装的H.264码流中,每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitLength,在读取某个NALU之前,先把该NALU前面的NALUnitLength读取出来,拿到该NALU的总长度,然后根据该长度读取相应的字节数,读取出整个NALU。

而FFmpeg源码内部使用get_nalsize函数读取出某个NALU前面的NALUnitLength。

二、get_nalsize函数的定义

get_nalsize函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavcodec/h2645_parse.h中:

static inline int get_nalsize(int nal_length_size, const uint8_t *buf,int buf_size, int *buf_index, void *logctx)
{int i, nalsize = 0;if (*buf_index >= buf_size - nal_length_size) {// the end of the buffer is reached, refill itreturn AVERROR_INVALIDDATA;}for (i = 0; i < nal_length_size; i++)nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];if (nalsize <= 0 || nalsize > buf_size - *buf_index) {av_log(logctx, AV_LOG_ERROR,"Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);return AVERROR_INVALIDDATA;}return nalsize;
}

该函数作用是读取avcC封装的H.264码流中某个NALU前面的NALUnitLength,或者读取AVCDecoderConfigurationRecord中某个SPS前面的sequenceParameterSetLength,或者读取AVCDecoderConfigurationRecord中某个PPS前面的pictureParameterSetLength。由于SPS和PPS都属于一种特殊的NALU,所以sequenceParameterSetLength和pictureParameterSetLength也算是一种NALUnitLength。只是存贮每个sequenceParameterSetLength和pictureParameterSetLength需要固定2字节空间,而存贮每个NALUnitLength所需的空间由AVCDecoderConfigurationRecord中的lengthSizeMinusOne属性决定而已。

形参nal_length_size:输入型参数。如果是要读取某个NALU前面的NALUnitLength,形参nal_length_size的值为“存贮该NALU对应NALUnitLength所需的以字节为单位的空间”;如果是要读取sequenceParameterSetLength或pictureParameterSetLength,形参nal_length_size的值固定为2。

形参buf:输入型参数,指向某个缓冲区。

1.如果是要读取某个NALU前面的NALUnitLength,该缓冲区存放该NALU对应的NALUnitLength + NALU Header + EBSP;

2.如果是要读取某个SPS前面的sequenceParameterSetLength,该缓冲区存放该SPS对应的sequenceParameterSetLength + NALU Header + 该SPS实际的NALU数据(该SPS的EBSP);

3.如果是要读取某个PPS前面的pictureParameterSetLength,该缓冲区存放该PPS对应的pictureParameterSetLength + NALU Header + 该PPS实际的NALU数据(该PPS的EBSP);

形参buf_size:形参buf指向的缓冲区的长度,单位为字节。

形参buf_index:既是输入型参数也是输出型参数。表示读取到形参buf指向的缓冲区的第几个字节了。

形参logctx:输入型参数。用来输出日志,可忽略。

返回值:执行成功返回读取到的NALUnitLength或sequenceParameterSetLength或pictureParameterSetLength,失败返回一个负数。

三、get_nalsize函数的内部实现分析

get_nalsize函数中,首先判断是否读到了形参buf指向的缓冲区的末尾。如果已经读到了末尾,返回AVERROR_INVALIDDATA:

    if (*buf_index >= buf_size - nal_length_size) {// the end of the buffer is reached, refill itreturn AVERROR_INVALIDDATA;}

如果还没读到末尾,继续执行。通过下面语句,读取NALUnitLength或sequenceParameterSetLength或pictureParameterSetLength,存贮到局部变量nalsize中:

    for (i = 0; i < nal_length_size; i++)nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];

如果读取到的该NALU的总长度小于0,或者读取到的该NALU的总长度大于形参buf指向的缓冲区中剩下的还未被读取的空间,打印日志"Invalid NAL unit size”,并返回AVERROR_INVALIDDATA:

    if (nalsize <= 0 || nalsize > buf_size - *buf_index) {av_log(logctx, AV_LOG_ERROR,"Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);return AVERROR_INVALIDDATA;}

读取成功返回NALUnitLength或sequenceParameterSetLength或pictureParameterSetLength的值:

    return nalsize;

相关文章:

音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现

一、引言 从《音视频入门基础&#xff1a;H.264专题&#xff08;18&#xff09;——AVCDecoderConfigurationRecord简介》中可以知道&#xff0c;avcC跟AnnexB不一样&#xff0c;avcC包装的H.264码流中&#xff0c;每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitL…...

【uniapp】设置公共样式,实现公共背景等

目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…...

Node.js学习笔记

回顾&#xff1a; javascript 可以在浏览器运行 &#xff08;js代码会JavaScript的解析引擎执行&#xff09;chrome 》V8 &#xff08;性能最好&#xff09;FireFox 》 奥丁猴safri 》JSCoreIE浏览器 》查克拉JavaScript可以在浏览器端操作DOM 和BOM每一个浏览器都内置了B…...

resnetv1骨干

# 普通的卷积残差块 def apply_basic_block( x, filters, kernel_size3, stride1, conv_shortcutTrue, nameNone ): # 预设块名称前缀 if name is None: name f"v1_basic_block_{keras.backend.get_uid(v1_basic_block_)}" # 设置残差连接前…...

设计模式,面试级别的详解(持续更新中)

设计模式&#xff0c;面试级别的详解(持续更新中) 软件的设计原则 常⽤的⾯向对象设计原则包括7个&#xff0c;这些原则并不是孤⽴存在的&#xff0c;它们相互依赖&#xff0c;相互补充。 开闭原则&#xff08;Open Closed Principle&#xff0c;OCP&#xff09;单⼀职责原则…...

第9篇:网络访问控制与认证机制

目录 引言 9.1 访问控制策略概述 9.2 认证机制的使用 9.3 密钥分发与证书机制 9.4 访问控制与认证在网络安全中的应用 9.5 网络访问控制与认证的挑战 9.6 总结 第9篇&#xff1a;网络访问控制与认证机制 引言 随着计算机网络的不断普及&#xff0c;安全问题日益受到关…...

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源&#xff08;以阿里为例&#xff09; 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…...

STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来

参考文档&#xff1a; STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来 - asml - 博客园 症状 最近开始学习STM32Cube,发现新建工程后无法正常调试,过了HAL_Init();之后就无法继续调试了. 无法进行让程序暂停以及停止等操作.并在输出窗口不断刷出 ERROR: Can n…...

Ajax(web笔记)

文章目录 1.Ajax的概念2.Ajax 的作用3.原生Ajax4.Axios4.1Axios的概念4.2Axios入门 1.Ajax的概念 AsynchronousJavaScriptAndXML&#xff0c;异步的JavaScript和XML 2.Ajax 的作用 数据交换:过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互:可以在…...

多入口+vite+vue3预渲染方案

如果你的项目要求加载速度要快,我们如果使用传统的vue3+sfc模式去开发,因为只有一个根节点,空白页面加载出来之后js才回去加载组件渲染,这样页面总是有一个短暂的空白。我们这里不讨论服务器端ssr和预渲染方案,仅仅是为了满足比较极端的优化需求,在这种情况下我的这套方案…...

Vue3+Ts函数封装与应用

目录 一、基础函数 二、实际应用 2.1、根据id找到对应的value值(找第一个) 2.2、根据id找到对应的value值(找所有) 2.3、不重复的升序数组找数字(二分查找) 2.4、重复的无序数组找数字(统计个数) 2.5、将数组整理为树结构(省市区为例) 为什么要积累呢&#xff1f;因为面…...

C语言全局变量和局部变量同时应用的题题型[求一堆数组中10个学生的成绩里最高分、最低分和平均分。]

C语言函数 全局变量与局部结合变量题。 本片代码中包含全局变量max和min。 以及局部变量aver。 全局变量运用于从定义变量开始&#xff0c;局部变量运用于定义它的调用函数内。 正文开始: #include <stdio.h> int max0,min0; int main() { int average(int array[…...

深度学习实战94-基于图卷积神经网络GCN模型的搭建以及在金融领域的场景

大家好,我是微学AI,今天给大家介绍一下深度学习实战94-基于图卷积神经网络GCN模型的搭建以及在金融领域的场景。文章首先介绍了GCN模型的原理及模型结构,随后提供了数据样例,并详细展示了实战代码。通过本文,读者可以深入了解GCN模型在金融场景下的应用,同时掌握代码的具…...

.NET 6新特性 | System.Text.Json功能改进

在.NET 6.0中&#xff0c;JSON处理库得到了显著的改进&#xff0c;主要体现在System.Text.Json上。以下是对.NET 6.0中改进的JSON处理库的详细分析&#xff1a; 一、System.Text.Json的引入与优势 在.NET 6中&#xff0c;Microsoft引入了新的JSON库System.Text.Json作为官方推…...

Matlab如何对全局优化算法启动并行计算

在 MATLAB 中&#xff0c;启用并行计算可以显著提高一些优化算法&#xff08;如遗传算法 ga 和粒子群算法 particleswarm&#xff09;的速度&#xff0c;特别是在种群或粒子群较大时。要启用并行计算&#xff0c;可以使用 UseParallel 参数。 1. 启用并行计算步骤 Step 1: 检…...

MYSQL-查看数据库中的存储过程语法(六)

13.7.5.9 SHOW CREATE PROCEDURE 语句 SHOW CREATE PROCEDURE proc_name此语句是 MySQL 扩展。它返回确切的字符串 &#xff0c;可用于重新创建命名的存储过程。SHOW CREATE FUNCTION&#xff0c;显示有关存储函数的信息 &#xff08;参见第 13.7.5.8 节“ SHOW CREATE FUNCTI…...

【深度学习】(12)--模型部署 <连接客户端与服务端>

文章目录 模型部署一、模型部署的定义与目的二、模型部署的步骤三、模型部署的方式四、Flask框架五、实现模型部署1. 搭建服务端1.1 初始化Flask app1.2 加载模型1.3 数据预处理1.4 构建装饰器1.5 完整代码 2. 搭建客户端2.1 服务端网址2.2 发送请求2.3 完整代码 六、运行使用 …...

优化SQL查询的最佳实践:提升数据库性能的关键

SQL 查询是数据库操作的核心&#xff0c;特别是当数据量庞大时&#xff0c;性能问题尤为明显。优化 SQL 查询不仅能减少响应时间&#xff0c;还能提高系统整体的可伸缩性。本文将从索引、查询结构、数据库设计和缓存等方面详细介绍如何优化 SQL 查询以提升性能。 一、索引的使…...

【AIGC视频生成】视频扩散模型(综述+最新进展)

文章目录 一、综述1.1 扩散模型1.1.1 Denoising Diffusion Probabilistic Models (DDPMs)1.1.2 Score-Based Generative Models (SGMs)1.1.3 Stochastic Differential Equations (Score SDEs) 1.2 相关任务1.3 数据集1.4 评价指标 二、年度进展1.runway gen2.1 Gen-1&#xff1…...

如何下载3GPP协议?

一、进入3GPP网页 https://www.3gpp.org/ 二、点击“Specifications &Technologies” 三、点击“FTP Server” 网址&#xff1a; https://www.3gpp.org/specifications-technologies 四、找到“latest”&#xff0c;查看最新版 网址&#xff1a; https://www.3gpp.org/ftp…...

卡证检测矫正模型Web界面使用教程:中文操作+实时结果可视化

卡证检测矫正模型Web界面使用教程&#xff1a;中文操作实时结果可视化 你是不是经常需要处理身份证、护照、驾照这些卡证图片&#xff1f;比如要上传证件照办业务&#xff0c;或者批量处理一堆证件材料。最头疼的就是拍出来的照片歪歪扭扭&#xff0c;背景杂乱&#xff0c;还得…...

UI-TARS-desktop部署避坑指南:快速解决模型启动问题

UI-TARS-desktop部署避坑指南&#xff1a;快速解决模型启动问题 1. UI-TARS-desktop概述 1.1 核心功能与架构 UI-TARS-desktop是一款基于Qwen3-4B-Instruct-2507模型的多模态AI应用框架&#xff0c;采用vLLM推理引擎提供高效服务。该系统将大语言模型能力与桌面自动化操作相…...

5分钟搞定OpenClaw+Kimi-VL-A3B-Thinking:星图GPU镜像一键体验

5分钟搞定OpenClawKimi-VL-A3B-Thinking&#xff1a;星图GPU镜像一键体验 1. 为什么选择云端沙盒体验OpenClaw 作为一个长期折腾本地AI部署的技术爱好者&#xff0c;我深刻理解配置环境的痛苦。上周尝试在MacBook Pro上手动部署OpenClaw时&#xff0c;光是解决Node.js版本冲突…...

快速上手klein.php:PHP轻量级路由器的完整入门指南

快速上手klein.php&#xff1a;PHP轻量级路由器的完整入门指南 【免费下载链接】klein.php A fast & flexible router 项目地址: https://gitcode.com/gh_mirrors/kl/klein.php klein.php是一款快速灵活的PHP路由器&#xff0c;专为简化Web应用的路由管理而设计。作…...

西门子1500T插补控制从入门到精通:手把手教你配置直线与圆弧轨迹(附程序源码)

西门子1500T插补控制从入门到精通&#xff1a;手把手教你配置直线与圆弧轨迹&#xff08;附程序源码&#xff09; 在工业自动化领域&#xff0c;精确控制多轴协同运动一直是核心挑战。想象一下机械臂需要画一个完美的圆&#xff0c;或者CNC机床要切割复杂曲线——这些场景都离不…...

VSCode高效前端开发:Live Server插件与Chrome浏览器无缝联调指南

1. 为什么你需要Live Server插件 作为前端开发者&#xff0c;最烦人的事情莫过于每次修改代码后都要手动刷新浏览器。我刚开始写前端的时候&#xff0c;经常在HTML、CSS和JavaScript文件之间来回切换&#xff0c;每次保存后都要切到浏览器按F5&#xff0c;效率低得让人抓狂。直…...

2026年4月,天府新区,成都装修公司哪家好,北京我爱我家装饰(成都旗舰店)

引言在快速发展的天府新区&#xff0c;装修选择成为了许多家庭和业主的首要问题。无论是新房装修、老房翻新还是局部改造&#xff0c;如何选择一家既专业又可靠的装修公司&#xff0c;确保从设计到施工的每个环节都令人满意&#xff0c;是大家最为关心的问题。本文将通过实际案…...

嵌入式环形缓冲区LwRB:高效数据流管理实践

1. 环形缓冲区&#xff1a;嵌入式数据流管理的基石在嵌入式系统开发中&#xff0c;数据流管理是个永恒的话题。想象一下这样的场景&#xff1a;你的物联网设备每秒接收数百个传感器数据包&#xff0c;串口不断涌入数据&#xff0c;而处理器需要有条不紊地处理这些信息。传统线性…...

【JEECG Boot】JEECG Boot 系统性知识体系全方位结构化总结

文章目录JEECG Boot一、平台基础定位与核心理念1. 核心定义与定位2. 核心设计理念二、整体技术架构体系1. 分层架构总览2. 核心技术栈明细3. 核心架构特性三、核心能力体系1. 低代码核心能力&#xff1a;代码生成器2. 零代码核心能力&#xff1a;Online在线开发3. AI原生赋能能…...

算法双杀:Trie(前缀树)实现 + 全排列(回溯经典)| 面试必刷模板题

目录 一、Trie&#xff08;前缀树&#xff09;&#xff1a;字符串查询的效率神器 什么是前缀树&#xff1f; 核心设计 完整实现代码 关键解析 二、全排列&#xff1a;回溯算法入门经典 题目描述 核心思路&#xff08;回溯法&#xff09; 完整实现代码 关键解析 三、…...