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视频数据时具有广泛的适用性。

相关推荐
Mr.简锋1 小时前
opencv视频读写
人工智能·opencv·音视频
春末的南方城市2 小时前
开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序
人工智能·计算机视觉·aigc·音视频
Hali_Botebie3 小时前
采样率22050,那么CHUNK_SIZE 一次传输的音频数据大小设置多少合适?unity接收后出现卡顿的问题的思路
音视频
风之馨技术录3 小时前
智谱AI清影升级:引领AI视频进入音效新时代
人工智能·音视频
晚点吧4 小时前
视频横屏转竖屏播放-使用人脸识别+目标跟踪实现
人工智能·目标跟踪·音视频
EasyCVR4 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
cuijiecheng20186 小时前
音视频入门基础:MPEG2-TS专题(3)——TS Header简介
音视频
学编程的小程13 小时前
【安全通信】告别信息泄露:搭建你的开源视频聊天系统briefing
安全·开源·音视频
芯视音赖工14 小时前
传统型视频展台方案分享
音视频
melonbo14 小时前
音频采样数据格式
音视频