AVCC(AVC Configuration)NALU封装格式介绍(一种描述H.264视频流信息的封装格式,包含了视频编码的关键元数据,是大多是MP4 H.264视频流的NALU封装格式)

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

AVCC封装格式介绍

AVCC (AVC Configuration) 是一种描述H.264视频流信息的格式,广泛用于MPEG-4和Flash视频中。这种封装方式使得解码器在处理视频数据之前能获取到关键的解码参数。

1. H.264 视频编码简介

在详细探讨AVCC封装格式之前,先了解一下H.264视频编码技术。

1.1. H.264概述

H.264是一种常见的视频编码标准,也被称为MPEG-4 Part 10,或AVC(Advanced Video Coding)。它广泛应用于各种网络环境,从低速互联网连接到高清电视播放。

1.2. H.264编码结构

H.264视频流由一个或多个NALU (Network Abstraction Layer Units) 组成。每个NALU都包含一段连续的视频数据。在传输或存储时,这些NALU可能以不同的方式被组合或封装。

2. AVCC封装格式

AVCC是一种封装格式,用于描述H.264的NALU结构和参数。它包含了H.264编码所需的元数据,使得解码器可以理解并处理后续的视频数据。

2.1. AVCC结构

一个典型的AVCC包括以下部分:

1. 配置版本(configurationVersion)

配置版本是一个8位无符号整数,用于标识AVCC的版本。当前版本为1。

2. AVC Profile(AVCProfileIndication)

AVC Profile是一个8位无符号整数,表示视频流所使用的H.264 profile。每个profile定义了一组编码工具或算法,例如Baseline、Main和High。

3. 兼容性标志(profile_compatibility)

兼容性标志是一个8位无符号整数,描述了视频流的profile兼容性信息。这可以帮助解码器判断是否能处理该视频流。

4. AVC Level(AVCLevelIndication)

AVC Level是一个8位无符号整数,表示视频流所使用的H.264 level。每个level定义了一些参数的上限,如图像分辨率、比特率等。

5. 长度大小(lengthSizeMinusOne)

长度大小是一个8位无符号整数,表示NALU长度字段的字节数减1。它的值通常为3,表示NALU长度字段占用4个字节。

6. SPS数量(numOfSequenceParameterSets)

SPS数量是一个8位无符号整数,表示后续的Sequence Parameter Set的数量。

7. SPS集合(SequenceParameterSets)

SPS集合包含了一个或多个Sequence Parameter Set。每个SPS包含了影响整个视频序列的参数,如图像分辨率、颜色空间、帧率等。

8. PPS数量(numOfPictureParameterSets)

PPS数量是一个8位无符号整数,表示后续的Picture Parameter Set的数量。

9. PPS集合(PictureParameterSets)

PPS集合包含了一个或多个Picture Parameter Set。每个PPS包含了影响单个图像编码的参数,如量化参数、熵编码模式等。

2.2. AVCC与NALU

在H.264编码中,视频数据被组织为一系列的NALU(Network Abstraction Layer Units)。AVCC是一种常用于MP4文件的NALU封装格式。在AVCC封装格式中,每个NALU的长度都在前面明确指出,而不是使用起始码进行分隔。

除了视频数据本身,AVCC还包含两个关键的NALU:SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。这两个NALU包含了用于解码其他视频数据的参数。

3. 疑难技术点解析:SPS和PPS

SPS和PPS包含了视频编码的关键参数,例如图像尺寸、帧率等。如果没有正确的SPS和PPS,解码器无法正确解码视频流。

3.1. Sequence Parameter Set (SPS)

SPS包含一些影响整个视频序列的参数,如图像分辨率、颜色空间、帧率等。

3.2. Picture Parameter Set (PPS)

PPS则包含更具体的编码设置,如量化参数、熵编码模式等。

4. AVCC和其他封装格式

AVCC只是多种H.264封装格式中的一种。另一种常见的H.264封装格式是Annex B。这些封装格式定义了H.264视频数据的结构,并可以被包含在各种媒体文件容器中,如MP4、MKV等。

4.1. AVCC vs Annex B

相比Annex B,AVCC的主要优势在于它包含了视频编码的元数据。这使得解码器无需处理整个视频流就能获取到关键的编码参数。

在H.264视频编码中,常见的封装格式有AVCC和Annex B。这两种格式主要用于描述H.264视频数据的NALU(Network Abstraction Layer Units)。通常,在MP4文件中,H.264视频流会采用AVCC封装格式;而在传输流或原始视频流中,H.264视频流则更常见的是使用Annex B封装格式。

5. AVCC封装格式的应用

AVCC格式广泛用于流媒体传输和存储。例如,在MPEG-DASH和HLS等流媒体协议中,都会使用AVCC来描述H.264视频流。

6. 使用FFmpeg处理AVCC封装的视频数据

FFmpeg 是一个开源的跨平台解决方案,可用于处理音频、视频和其他多媒体文件和流。以下是一些常见的使用FFmpeg处理AVCC封装的H.264 MP4视频数据的例子。

假设我们有一个input.mp4,它的视频流封装格式为AVCC(大多数Mp4文件H.264 视频流的封装格式)

6.1. 提取H.264原始流

ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an output.h264

这个命令将从input.mp4中提取H.264原始流,并将其存储在output.h264中。-bsf:v h264_mp4toannexb选项用于将视频流从AVCC格式转换为Annex B格式。

6.2. 将H.264原始流封装到MP4容器中

ffmpeg -i input.h264 -c:v copy -bsf:v h264_annexbtomp4 output.mp4

这个命令将input.h264中的H.264原始流封装到output.mp4中。这里使用了h264_annexbtomp4 选项来将视频流从Annex B格式转换为AVCC格式。

7. AVCC封装格式的优缺点

7.1. 优点

  • AVCC包含了H.264编码所需的元数据,使得解码器无需处理整个视频流就能获取到关键的编码参数。
  • AVCC的结构简单,易于处理和解析。

7.2. 缺点

  • AVCC封装格式的处理需要对H.264编码有深入理解,否则可能导致错误。
  • 在某些情况下,AVCC封装格式可能不如其他格式(如Annex B)高效。

8. 结论

AVCC是一种描述H.264视频流信息的封装格式,包含了视频编码的关键元数据。这使得解码器可以在处理视频数据之前获取到关键的解码参数。虽然它在处理上可能比其他格式复杂一些,但其结构简单且易于解析,使其成为流媒体传输和存储中广泛使用的格式。