AnnexB封装格式介绍(主要用于H.264和H.265视频编码标准,是一种常见的视频流NALU封装格式,常用于RTSP、RTP传输)

参考文章:解码中的AnnexB和avcC两种分割数据方式

文章目录

  • AnnexB 格式介绍
    • 1. NALU单元与开始代码
      • 1.1 NALU单元
      • 1.2 开始代码
    • 2. AnnexB格式详述
      • 2.1 基本结构
      • 2.2 长度前缀
    • 3. 从AnnexB格式到AVCC格式
    • 4. AnnexB格式的优缺点
      • 4.1 优点
      • 4.2 缺点
    • 5. 疑难问题解析
      • 如何确定开始代码的长度?
      • 如何处理存在于NALU单元原始数据中的开始代码?
    • 6. AnnexB 格式的应用场景
    • 1. 视频流传输
    • 2. 视频文件存储
    • 3. 编解码器

AnnexB 格式介绍

AnnexB是一种常见的视频流NALU封装格式,主要用于H.264和H.265视频编码标准。其特性包括插入开始代码以标识NALU单元的开始,以及使用字节流方式传输数据。

1. NALU单元与开始代码

在理解AnnexB格式之前,首先需要了解NALU(Network Abstraction Layer Units)单元的概念。在H.264/H.265编码中,每个视频帧被编码为一个或多个NALU单元。

1.1 NALU单元

每个NALU单元都可以看作是视频数据的一个独立包,它包含一定数量的原始字节数据。这些数据可以是图像切片、序列参数集(SPS)、图像参数集(PPS)等类型。

1.2 开始代码

为了在字节流中识别出每个NALU单元的开始位置,AnnexB格式引入了所谓的"开始代码"。开始代码可以是两种形式:0x000001或0x00000001。当解析器在字节流中遇到这样的模式时,它知道一个新的NALU单元开始了。

2. AnnexB格式详述

接下来深入探讨一下AnnexB格式的具体内容和结构。

2.1 基本结构

AnnexB格式基本上就是一连串的NALU单元,每个单元由一个开始代码和随后的原始字节数据组成。

[开始代码] [NALU单元] [开始代码] [NALU单元] ...

2.2 长度前缀

在某些情况下,例如当数据被封装到其他容器(如MPEG-TS、MP4等)时,可能需要使用"长度前缀"而不是"开始代码"。长度前缀是一个固定长度的字段,通常为4个字节,表示接下来的NALU单元的长度。然而,这并不是AnnexB格式的一部分,而是属于AVCC格式。

3. 从AnnexB格式到AVCC格式

正如上文所述,有时需要将AnnexB格式转换为AVCC格式。这主要涉及两步:去掉开始代码,并添加长度前缀。

以下是一个简单的Python示例,演示如何进行此转换:

def annexb_to_avcc(annexb):avcc = b''nal_units = annexb.split(b'\x00\x00\x01')for nal_unit in nal_units:if len(nal_unit) == 0: continuelength_prefix = len(nal_unit).to_bytes(4, 'big')avcc += length_prefix + nal_unitreturn avcc

注意,上述示例假设所有的开始代码都是0x000001。实际上,开始代码也可能是0x00000001,这种情况在处理时会稍微复杂一点。

4. AnnexB格式的优缺点

4.1 优点

AnnexB格式的主要优点是它非常简单。只需通过查找开始代码就可以在字节流中定位NALU单元。此外,由于每个NALU单元都是独立的,因此可以轻松处理视频流的一部分,而不必解析整个流。

4.2 缺点

AnnexB格式的主要缺点是它无法直接用于某些应用场景,例如封装到其他容器中(如MP4和MOV)。这就需要转换为AVCC格式或其他类似的格式。此外,由于开始代码可能存在于NALU单元的原始数据中,所以在处理时需要特别小心。

5. 疑难问题解析

如何确定开始代码的长度?

一种常见的问题是如何确定开始代码的长度。在理想情况下,开始代码应该是0x000001,但在实践中,它也可能是0x00000001。解决方案通常是检查第一个非零字节后面的字节:如果它是1,则开始代码的长度为3,否则为4。

如何处理存在于NALU单元原始数据中的开始代码?

另一个常见的问题是如何处理存在于NALU单元原始数据中的开始代码。解决方案是在编码过程中进行"逃逸编码":每当遇到0x000003的模式时,就将其替换为0x00000303。这样,在解码时就可以安全地忽略第二个03字节,而不会误判为开始代码。

6. AnnexB 格式的应用场景

AnnexB格式主要出现在视频流传输和存储的环境中。它是ITU-T H.264(也称为MPEG-4 AVC)和H.265(也称为HEVC)视频编码标准的一部分。

1. 视频流传输

在实时视频流传输中,如RTSP(Real Time Streaming Protocol)和RTP(Real-time Transport Protocol),AnnexB格式被广泛使用。在这些情况下,每个NALU单元都可以被视为一个独立的包,可以单独发送。这种NALU单元级别的可分割性使得AnnexB格式非常适合于实时视频流传输。

2. 视频文件存储

在视频文件存储中,如MP4、MKV等容器格式,原始的H.264/H.265数据通常需要从AnnexB格式转换为AVCC或其他类似格式。这是因为这些容器格式通常使用长度前缀而不是开始代码来标识NALU单元的边界。然而,在某些情况下,例如在MPEG-2 TS流中,仍然可能使用AnnexB格式。

3. 编解码器

许多硬件和软件编解码器都支持AnnexB格式。例如,FFmpeg库和x264/x265编解码器就提供了对AnnexB格式的内置支持。这些编解码器通常允许用户选择是否使用AnnexB格式,以及如何处理SPS和PPS等NALU单元。


总的来说,AnnexB格式在各种视频编解码、传输和存储的应用场景中都有重要作用。其简单的结构和灵活的NALU单元级别的可分割性使其在处理H.264/H.265视频数据时具有广泛的适用性。

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

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

相关文章

Android readelf 工具查找函数符号

ELF(Executable and Linkable Format)是一种执行文件和可链接文件的格式。它是一种通用的二进制文件格式,用于在各种操作系统中存储可执行程序、共享库和内核模块。 Android 开发当中的 so 库本质上就是一种特殊类型的 ELF 文件,…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《考虑灵活性补偿的高比例风电与多元灵活性资源博弈优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到高比例风电与多元灵活性资源在博弈优化调度中考虑灵活性补偿的问题。以下是对标题各个部分的解读: 高比例风电: …

【模拟IC学习笔记】Cascode OTA 设计

辅助定理 增益Gm*输出阻抗 输出短路求Gm 输入置0求输出阻抗 求源极负反馈的增益 随着Vin的增加,Id也在增加,Rs上压降增加,所以,Vin的一部分电压体现在Rs上,而不是全部作为Vgs,因此导致Id变得平滑。 Rs足…

【数据结构篇】数据结构中的 R 树和 B 树

数据结构中的 R 树和 B 树 ✔️关于R树(RTree)✔️什么是B树(B-tree)✔️B树和B树的区别✔️B树和B树在数据存储方面的具体差异 ✔️拓展知识仓✔️R树和B树的区别✔️ 那在内存消耗上有什么区别?✔️ R树有哪些优点和…

【算法与数据结构】509、LeetCode斐波那契数

文章目录 一、题目二、递归,动态规划解法2.1 递归解法2.2 动态规划解法 三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、递归,动态规划解法 2.1 递归解法 思路分析:斐波…

go 语言中的 iota

我们经常会在我们的代码中定义类似以下这些常量: const (ColorRed "Red"ColorGreen "Green"ColorBlue "Blue" )在其他时候,我们仅仅关注能把一个东西与其他的做区分。 有些时候,有些时候一件事没有本质…

【Leetcode】240. 搜索二维矩阵 II

一、题目 1、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1: 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21…

Pytorch:torch.nn.Module.apply用法详解

torch.nn.Module.apply 是 PyTorch 中用于递归地应用函数到模型的所有子模块的方法。它允许对模型中的每个子模块进行操作,比如初始化权重、改变参数类型等。 以下是关于 torch.nn.Module.apply 的示例: 1. 语法 Module.apply(fn)Module:P…

【REST2SQL】05 GO 操作 达梦 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 信创要求用国产数据库,刚好有项目用的达梦,研究一下go如何操作达梦数据库 1 准备工作 1.1 安…

ros2 基础学习 15- URDF:机器人建模方法

URDF:机器人建模方法 ROS是机器人操作系统,当然要给机器人使用啦,不过在使用之前,还得让ROS认识下我们使用的机器人,如何把一个机器人介绍给ROS呢? 为此,ROS专门提供了一种机器人建模方法——…

2024华为OD机试:最多几个直角三角形

题目描述 有N条线段&#xff0c;长度分别为a[1]-a[n]。 现要求你计算这N条线段最多可以组合成几个直角三角形。每条线段只能使用一次&#xff0c;每个三角形包含三条线段。 输入描述 第一行输入一个正整数T(1<T<100),表示有T组测试数据.对于每组测试数据&#xff0c;…

软件测试|SQL中的UNION和UNION ALL详解

简介 在SQL&#xff08;结构化查询语言&#xff09;中&#xff0c;UNION和UNION ALL是用于合并查询结果集的两个关键字。它们在数据库查询中非常常用&#xff0c;但它们之间有一些重要的区别。在本文中&#xff0c;我们将深入探讨UNION和UNION ALL的含义、用法以及它们之间的区…

Ubuntu 22.04 编译安装 Qt mysql驱动

参考自 Ubuntu20.04.3 QT5.15.2 MySQL驱动编译 Ubuntu 18.04 编译安装 Qt mysql驱动 下边这篇博客不是主要参考的, 但是似乎解决了我的难题(找不到 libmysqlclient.so) ubuntu18.04.2 LTS 系统关于Qt5.12.3 无法加载mysql驱动&#xff0c;需要重新编译MYSQL数据库驱动的问题以…

【代码随想录】刷题笔记Day45

前言 早上又赖了会床......早睡早起是奢望了现在&#xff0c;新一年不能这样&#xff01;支棱起来&#xff01; 377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 这一题用的就是完全背包排列数的遍历顺序&#xff1a;先背包再物品&#xff0c;从前往后求的也是有几…

IO类day01

File类 File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径) 使用File可以做到: 1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等 2:创建和删除文件或目录 3:访问一个目录中的子项 但是File不能访问文件数据. pu…

mac电脑php命令如何设置默认的php版本

前提条件&#xff1a;如果mac电脑还没安装多个PHP版本&#xff0c;可以先看这篇安装一下 mac电脑运行多个php版本_mac 同时运行两个php-CSDN博客 第一部分&#xff1a;简单总结 #先解除现在默认的php版本 brew unlink php7.4#再设置的想要设置的php版本 brew link php8.1第二部…

AWS Simple Email Service (SES) 实战指南

Amazon Simple Email Service (SES) 是一项强大的电子邮件发送服务&#xff0c;适用于数字营销、应用程序通知以及事务性邮件。在这个实战指南中&#xff0c;我们将演示如何设置 AWS SES 并通过几个示例展示其用法。 设置 AWS SES 1. 创建 AWS 账户 首先&#xff0c;您需要创…

c++学习:容器list实战(获取目录返回容器list)

新建一个dir.h,声明dir类 #ifndef DIR_H #define DIR_H#include <sys/types.h>#include <dirent.h> #include <stdio.h> #include <string.h>#include <iostream> #include <list>class Dir { public:Dir();static std::list<std::str…

Java20:反射

1. 概念2. 获取成员变量2.1 获取public修饰的成员变量2.2 获取已声明的属性 3.获取方法3.1 获取public修饰的&#xff0c;和继承自父类的 方法3.2 获取本类中定义的方法 4. 获取构造器4.1 获取所有public修饰的构造器4.2 获取本类中定义的构造器 5.jdk文件分析5.1bin目录&#…

CodeGPT,你的智能编码助手—CSDN出品

CodeGPT是由CSDN打造的一款生成式AI产品&#xff0c;专为开发者量身定制。 无论是在学习新技术还是在实际工作中遇到的各类计算机和开发难题&#xff0c;CodeGPT都能提供强大的支持。其涵盖的功能包括代码优化、续写、解释、提问等&#xff0c;还能生成精准的注释和创作相关内…