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

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

文章目录

  • [AnnexB 格式介绍](#AnnexB 格式介绍)
    • [1. NALU单元与开始代码](#1. NALU单元与开始代码)
      • [1.1 NALU单元](#1.1 NALU单元)
      • [1.2 开始代码](#1.2 开始代码)
    • [2. AnnexB格式详述](#2. AnnexB格式详述)
      • [2.1 基本结构](#2.1 基本结构)
      • [2.2 长度前缀](#2.2 长度前缀)
    • [3. 从AnnexB格式到AVCC格式](#3. 从AnnexB格式到AVCC格式)
    • [4. AnnexB格式的优缺点](#4. AnnexB格式的优缺点)
      • [4.1 优点](#4.1 优点)
      • [4.2 缺点](#4.2 缺点)
    • [5. 疑难问题解析](#5. 疑难问题解析)
    • [6. AnnexB 格式的应用场景](#6. AnnexB 格式的应用场景)
    • [1. 视频流传输](#1. 视频流传输)
    • [2. 视频文件存储](#2. 视频文件存储)
    • [3. 编解码器](#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单元,每个单元由一个开始代码和随后的原始字节数据组成。

py 复制代码
[开始代码] [NALU单元] [开始代码] [NALU单元] ...

2.2 长度前缀

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

3. 从AnnexB格式到AVCC格式

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

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

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: continue
        length_prefix = len(nal_unit).to_bytes(4, 'big')
        avcc += length_prefix + nal_unit
    return 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视频数据时具有广泛的适用性。

相关推荐
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
G佳伟9 小时前
【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案
chrome·百度·音视频
灵感素材坊19 小时前
解锁音乐创作新技能:AI音乐网站的正确使用方式
人工智能·经验分享·音视频
modest —YBW19 小时前
视频大小怎么计算?视频码率是什么,构成视频清晰度的核心要素!
音视频
cuijiecheng201819 小时前
音视频入门基础:RTP专题(10)——FFmpeg源码中,解析RTP header的实现
ffmpeg·音视频
AI服务老曹19 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
Macdo_cn1 天前
My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片
macos·音视频
kiramario1 天前
【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开
开发语言·javascript·音视频
余~~185381628001 天前
矩阵碰一碰发视频的后端源码技术,支持OEM
线性代数·矩阵·音视频
划水哥~1 天前
高清下载油管视频到本地
音视频