1. AAC音频编码

AAC(Advanced Audio Coding)是一种用于音频压缩和编码的标准,用于提高音频编码效率。AAC在保持音质的同时,压缩率比MP3更高,它使用更多的编码技术,包括MDCT(Modified Discrete Cosine Transform)和临时噪音形状编码等。

AAC音频编码的主要步骤如下:

  1. 像元分析:将音频分成许多小部分,每部分被称为一个“像元”。
  2. 频谱处理:使用Modified Discrete Cosine Transform (MDCT)将每个像元从时间域转换为频率域。
  3. 声音感知编码:用模型化的人类听觉系统来处理信号,以便更有效地编码音频。这些模型可以帮助删除人耳听不到的音频部分,并缩小的人耳几乎听不到的部分。
  4. 量化编码:通过量化过程,将声音信息转变为数字信号。

AAC编码规格

以下是AAC编码的规格和它们的主要用途:

  1. AAC-LC (Low Complexity Profile):
  • 最常用的AAC profile。
  • 广泛兼容、低处理复杂度且音质良好。
  • 适合用于现代数字音频播放。
  1. HE-AAC (High Efficiency AAC, aka AAC+):
  • 增加了Spectral Band Replication (SBR)。
  • 用于流媒体和广播,特别是在比特率较低时能够保持较好的音质。
  1. HE-AAC v2 (aka eAAC+):
  • HE-AAC的延伸,增加了Parametric Stereo (PS)。
  • 针对单声道信号提供立体声编码,适合极度低比特率的应用。
  1. AAC-LD (Low Delay AAC):
  • 针对实时通讯设计,如视频会议。
  • 低延迟,但比特率比AAC-LC高。
  1. AAC-ELD (Enhanced Low Delay AAC):
  • 结合了AAC-LD和SBR技术。
  • 用于需要高质量和超低延迟的实时应用,如远程音乐表演。
  1. MPEG 2 AAC-LC:
  • MPEG 2标准中的AAC。
  • 较为早期的AAC实现,和MPEG 4 AAC-LC相似。
  1. MPEG 2 AAC-SSR (Scalable Sample Rate):
  • 可伸缩采样率。
  • 较少使用,主要在特定需要中实现。
  1. MPEG 2 AAC-PS (Parametric Stereo):
  • 并不是一个完整的profile,而是HE-AAC的一部分。
  • 用于立体声信号的更高效编码。
  1. MPEG 4 AAC-LTP (Long Term Prediction):
  • 引入了长时预测编码。
  • 被认为有较高的编码效率,但不如AAC-LC广泛支持。
  1. MPEG 4 SLS (Scalable to Lossless):
  • 也称为HD-AAC。
  • 一种可伸缩的编码,可以从有损编码无缝过渡到无损编码。

AAC编码的特点

AAC编码具有一系列重要的特点,使其成为多种应用场景中的首选音频压缩格式:

  1. 高音质: AAC提供了比MP3更高的音质,在相同比特率下通常有更好的声音复现性。
  2. 多通道支持: AAC支持多达48个音频通道,包括5.1或7.1环绕声。
  3. 有效的压缩: 通过高效的编码算法,AAC在较小的文件大小下提供优质的音频。
  4. 广泛的采样频率: 适用于从8 kHz(电话质量)到96 kHz(高解析度音频)的广泛采样频率。
  5. 可伸缩性: 高效AAC (HE-AAC) 版本在非常低的比特率下仍然能提供合理的音质,适用于流媒体和广播。
  6. 低延迟: 针对实时应用,AAC-LD和AAC-ELD提供了低延迟选项,适合视频会议和直播。
  7. 弹性和适配性: AAC编码可以灵活适应多种编码需求和硬件能力,方便开发者调整以适合特定的产品或服务。
  8. 兼容性: AAC是国际标准,由多个设备和平台广泛支持。
  9. 元数据支持: AAC格式可以嵌入丰富的元数据信息,包括歌曲标题、专辑封面和其他标签信息。
  10. 数字版权管理(DRM)支持: 在某些情况下,AAC格式可以结合数字版权管理技术使用,以保护版权内容。

AAC音频文件格式

在AAC音频编码中,有两种广为人知的文件格式:ADIF(Audio Data Interchange Format)和ADTS(Audio Data Transport Stream)。这两种格式包含编码音频数据,但它们各有特点和用途。

ADIF

AAC ADIF格式的文件的基本结构是由一个56字节的文件头和随后的音频帧数据组成的。下面是该文件头的详解:

  1. adif_id: 这是一个32位(4字节)的字段,主要用于识别文件是不是ADIF格式。它的值通常是’ADIF’。
  2. copy_id_present: 这是一个1位的字段,用于标识是否有额外的版权字段。如果设置为1,则后面会跟着一个72字节的版权信息。
  3. home: 这是一个1位的字段,通常设置为0。
  4. bitstream_type: 这是一个1位的字段,用于标识比特流是常量比特率(CBR)还是变量比特率(VBR)。0表示CBR,1表示VBR。
  5. bitrate: 这是一个23位的字段,代表着比特流的比特率。
  6. num_program_config_elements: 这是一个4位的字段,表示ADIF文件中的"program_config_element"的数量。通常这个值为0。
  7. adif_buffer_fullness: 这是一个20位的字段,表示缓冲区的大小。

ADIF文件头之后就是实际的音频帧数据。每个音频帧都有自己的头信息和数据内容,包括帧的长度、采样率、声道数等信息。

ADTS

ADTS帧由两大部分组成:ADTS固定头和ADTS可变头,随后是原始AAC帧数据。

ADTS固定头(共有7字节)

  1. Syncword (同步字): 固定为0xFFF, 占据前12位,用于标识每个ADTS帧的开始。
  2. MPEG Version (MPEG版本): 1位,区分是MPEG-2(1)还是MPEG-4(0)编码。
  3. Layer: 2位,总是为0。
  4. Protection absent (CRC校验): 1位,表示是否禁止错误校验。1表示没有CRC,0表示有CRC。
  5. Profile (编码配置文件): 2位,用于表示AAC的编码层次。
  6. Sampling frequency index (采样频率索引): 4位,代表音频数据的采样率。
  7. Private bit (私有位): 1位,可以自由使用,但在多数情况下为0。
  8. Channel configuration (声道配置): 3位,表示音频数据是单声道、立体声等。
  9. Originality: 1位,暂未使用。
  10. Home: 1位,暂未使用。

ADTS可变头

  1. Copyright (版权): 1位,标识是否有版权。
  2. Copy protection (拷贝保护状态): 1位,标识是否允许复制。
  3. Frame length (帧长度): 13位,代表整个ADTS帧的长度,包括头部和数据。
  4. Buffer fullness (缓冲区满度): 11位,表示解码器缓冲区的状态。
  5. Number of AAC frames (音频帧的数量): 2位,一个ADTS帧内可能含有多个AAC原始帧。

错误校验

如果protection absent字段置0,表示存在2字节的错误检验码(CRC校验),来保障数据完整性。

紧接着这些头信息之后,便是AAC编码的音频数据。每个ADTS帧都包含这样的头信息,因此音频流可在任何帧的头信息处实现同步,非常适合流媒体传输的场景。由于ADTS头部本身并不复杂,它对于传输过程的额外开销也比较小。

AAC文件处理流程

1. AAC音频解码:

ffmpeg -i input.aac -c:a pcm_s16le output.wav

这个命令将AAC格式的文件解码为WAV格式。-i指定输入文件,-c:a pcm_s16le指定音频编码器为PCM编码的16位小端(-s16le)格式。

2. AAC音频编码:

ffmpeg -i input.wav -c:a libfdk_aac output.aac

此命令将WAV格式的音频文件编码为AAC格式的文件。这里,-c:a libfdk_aac表示使用libfdk_aac编码器来编码音频。

3. 视频转码并将音频编码为AAC

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mkv

该命令将一个MP4格式的视频转码为MKV格式,同时将音频编码为AAC。这里,-c:v libx264用于指定视频使用libx264编码器(即,H.264编码),-c:a aac用于指定音频使用aac编码。

4. 剪辑AAC音频

ffmpeg -i input.aac -ss 00:00:30 -to 00:01:30 output.aac

这个命令将从输入的AAC音频文件中剪辑出30秒到1分30秒之间的部分。-ss参数用于设置剪辑的起始时间,-to参数用于设置剪辑的结束时间。

AAC ES 详解

Elementary Stream(基本流)

Elementary Stream是一种仅包含单一媒体类型(音频或视频)数据的格式。在音频ES中,不包含任何额外的元数据或者是多媒体容器封装信息,仅仅是纯粹的音频数据。对于AAC而言,ES通常指裸的AAC码流。

AAC ES的处理

要处理AAC ES,开发者需要使用各种编解码库,如FFmpeg的库来解码或编码AAC流。流程大概分为这几步:

  • 编码:将原始音频信号(PCM数据)通过AAC编码器转换成AAC ES。
  • 解码:将AAC ES通过AAC解码器转换回原始音频信号(PCM数据)用于播放。

封装和传输

在将AAC ES送入网络或存储到文件之前,通常需要将AAC ES封装到某种容器格式中,例如MP4、MKV或ADTS(Audio Data Transport Stream)。封装操作不仅仅是将音频数据“包装”起来,还包括添加同步、错误检测与恢复、元数据(比如音频的采样率、比特率等信息)等。

流媒体中的AAC ES

在流媒体应用中,AAC ES常常以切片(segment)的形式存在。在HTTP Live Streaming (HLS)和Dynamic Adaptive Streaming over HTTP (DASH)等流媒体技术中,AAC ES会被封装到各自的传输格式中,并按照段划分成较小的文件以便传输和适应不同的网络条件。

AAC算法

AAC(Advanced Audio Coding)算法是一种高效的音频编码方式,由MPEG组织作为MP3的后继者所开发,也是MPEG-2和MPEG-4标准的一部分。AAC算法在保证音质的前提下,做到了高效压缩,比同等音质的MP3文件小。

1. AAC编码的特性

  • AAC支持多通道,最多支持48个全带宽(full-bandwidth)的音频通道
  • 采样率从8kHz到96kHz
  • 支持比特率从8kbps到320kbps+
  • 更准确的声音重建,尤其是在16kHz以上的高频部分

2. AAC编码流程

AAC编码算法大致流程如下:

  • 时变时域预测(Temporal Noise Shaping, TNS):TNS利用音频的时变特性来改善音频编码的效率,它对音频信号进行预滤波处理,然后在解码时采取相应的逆向操作来还原音频信号。
  • 频域预测(Prediction):在编码过程中,频域预测用于提高高频区的编码效率。对频谱线进行预测,得到预测误差后对误差进行编码,这样可将高频部分的redundancy消除,提高编码效率。
  • 门限噪声级别(Threshold in Quiet, TQ):在人耳听觉系统中,对于音量非常小的信号,人耳是无法听到的,因此在编码时,这些信号可以不编码,达到降低比特率的效果,门限噪声级表就是为了判断信号是否足够大而设置的。
  • 临界带(Critical Band):人耳对频率的敏感度随频率的增加而逐渐减小,人耳的这一特性为AAC编解码省去了大量工作,并且也为AAC的高效率编码提供了理论支持。
  • 位分配与量化(Bit allocation and Quantization):量化后的误差需要进行编码,但是编码误差需要耗费比特率。因此,需要对量化误差进行合理的位分配,方法是使用比特率和失真度之间的比例关系进行迭代计算,得到最优比特分配。
  • 熵编码(Entropy Coding):熵编码主要包括动态位分配和Huffman编码,动态位分配采用比特率和失真度之间的比例关系进行迭代计算,得到最优比特分配,Huffman编码是对量化后的系数进行Huffman编码。

2. H264视频编码

H.264,也称为AVC(Advanced Video Coding,高级视频编码),是由ITU-T视频编码专家组(VCEG)与ISO/IEC移动图像专家组(MPEG)联合制定的一种视频编码标准。

视频编码的本质是通过各种算法压缩原始视频数据,以减少存储和传输过程中所需的带宽,同时尽可能保持视频的质量。视频编码的过程涉及去除视频数据中的多余信息,包括空间冗余、时间冗余和统计冗余。这里是更详细的解释:

空间冗余(Spatial Redundancy)
空间冗余指的是视频帧内部各像素之间的相似性或重复性。由于相邻像素往往在颜色和亮度上相似,因此可以通过变换和量化过程来降低冗余信息,仅使用更少的数据描述更大的区域。例如,通过变换编码(如离散余弦变换DCT)和量化步骤,可以去除人眼不敏感的高频信息,从而减少所需的比特数。

时间冗余(Temporal Redundancy)
时间冗余指的是连续视频帧之间内容的相似性。在大多数视频场景中,几个连续的帧往往非常相似。视频编码利用这种冗余,通过仅存储相对于前一帧发生变化的部分来减少数据量。运动估计和运动补偿的技术被用来检测和编码这些帧之间的差异,例如P帧(预测帧)和B帧(双向预测帧)就是基于这种技术。

统计冗余(Statistical Redundancy)
统计冗余涉及到视频数据的概率分布特性,即某些符号出现频率高而有些出现频率低。通过熵编码(如霍夫曼编码和算术编码等)可以利用这种冗余,给常见的数据序列分配更短的编码,不常见的则分配更长的编码,从而达到压缩的目的。

视觉冗余(Perceptual Redundancy)
除了上述冗余,视频编码也会考虑人类视觉系统的特性,即视觉冗余。某些视觉信息的丢失对观看体验的影响较小,视频编码可以选择舍弃这部分信息以节约空间。比如,人眼对亮度的感知比对颜色更敏感,因此色彩信息可以通过色度抽样的形式被更多地压缩。

视频编码最终的目标是实现数据的有效压缩,通过删除这些冗余来减少数据量,而对视频质量的影响最小。

主要特点:

  • 高数据压缩率:H.264采用高效的编码技术来减少数据量,保持高质量的视频输出。
  • 网络友好:H.264设计时就考虑了网络传输,非常适合流媒体以及通过互联网分发。
  • 弹性和可扩展性:支持从低分辨率到高分辨率,可用于多种设备和网络条件。

关键技术:

  • 预测编码:利用时间和空间预测来提高压缩率。帧内预测使用同一帧内先前编码的块作为参考来预测当前块。帧间预测则利用之前和之后的帧来预测当前帧,减少冗余信息。
  • 变换和量化:变换将像素数据转换成频率部分,量化过程通过舍弃人类视觉不敏感的细节来减少数据量。
  • 熵编码:使用技术如上下文自适应变长编码(CAVLC)或上下文自适应二进制算术编码(CABAC)来有效压缩数据。
  • 环路滤波:为了减少压缩带来的块效应和其他噪声,H.264在编解码过程中使用一种称为环路滤波的技术来改善图像质量。

帧类型:

  • I帧(关键帧):帧内编码的图片,不依赖其他图片,是编码序列中的关键点。
  • P帧:通过参照前面的I或P帧来进行预测的图片。
  • B帧:使用之前和之后的帧进行双向预测的图片,可以提供更高的压缩率。

档案(Profiles)和级别(Levels):

  • 档案:定义了编码和解码视频的特定功能集合,比如Baseline Profile、Main Profile、High Profile等,这些档案支持不同的应用场景和设备要求。
  • 级别:限定了档案中特定编码参数的范围,比如码率、分辨率和帧率,用以确保设备之间的兼容性。

应用范围:

H.264被广泛用于:

  • Blu-ray光盘
  • 网络视频服务,如YouTube、Netflix
  • 视频会议系统
  • 数字电视广播
  • 智能手机视频等

H.264/AVC(高级视频编码)的功能结构

H.264/AVC(高级视频编码)的功能结构包括以下几个核心部分:

  1. 网络抽象层(NAL): NAL负责格式化数据并提供头信息,从而将视频传输变得对网络友好。NAL单元是码流的基本单位,使得H.264视频可以适应各种网络条件。
  2. 视频编码层(VCL): VCL是负责高效视频数据表示的部分,包括所有压缩的核心功能。它提供了高效的视频编码机制,通过预测、变换、量化等过程来去除冗余并压缩视频数据。
  3. 视频预处理: 这是视频信号进入编码器之前的处理,可能包括扫描格式转换、颜色空间转换等。
  4. 分块及宏块划分: 视频帧被分为宏块(macroblocks),这些是编码和解码过程中的基本单元。
  5. 帧内预测(Intra prediction): 对于静态或近乎静态的场景,帧内预测使用当前帧内已编码的数据来压缩宏块。
  6. 帧间预测(Inter prediction): 对于动态变化的视频内容,帧间预测使用先前已编码的帧来预测当前帧中的宏块。
  7. 变换(Transformation): 将宏块中的图像数据从空间域转换到频率域。
  8. 量化(Quantization): 减少变换后系数的精度,这是压缩过程中的一个关键步骤。
  9. 熵编码(Entropy Coding): 使用高效的编码技术如CAVLC或CABAC对量化的数据进行编码,以进一步压缩视频大小。
  10. 去块效应滤波器(Deblocking Filter): 减少因块状压缩而产生的视觉不连贯感。
  11. 速率控制(Rate Control): 管理编码视频的位速率,确保视频数据流满足网络或存储的带宽限制。
  12. 解码器: 将压缩的数据流解码回视频帧的过程。

视频编码层(VCL)

Video Coding Layer,它是负责高效视频编码的核心部分。VCL利用视频内容的时空冗余性进行编码,以达到压缩数据的目的。其详解如下:

编码单元

  • 宏块(Macroblocks):H.264将图像划分为大小为16x16像素的宏块进行处理,每个宏块可以进一步划分为子块进行不同的预测和转换处理。
  • 切片(Slices):视频帧可以更进一步被切割成称作切片的单元,这有助于错误恢复和并行处理。

预测

  • 帧内预测(Intra Prediction):对于图像中不随时间变化的区域,H.264使用帧内预测来对当前宏块进行编码,这是通过预测当前宏块的像素值从它周围已编码的像素值来实现的。
  • 帧间预测(Inter Prediction):对于运动的视频图像,通过参考之前已经编码的帧来预测当前帧,从而利用时间上的冗余信息进行编码。

变换和量化

  • 变换(Transform):使用离散余弦变换(DCT)或其他变换方法将宏块中的像素数值转换为一组频率数据,目的是集中能量,使数据更易于压缩。
  • 量化(Quantization):量化步骤通过减少变换系数的精确度来减少数据量,这是一个有损过程,通常会导致一些视频质量的损失。

熵编码

  • CAVLC(Context-based Adaptive Variable Length Coding):这是一种变长编码技术,依据内容的上下文信息来对变换和量化后的系数进行编码。
  • CABAC(Context-Based Adaptive Binary Arithmetic Coding):这是一种更高效的编码技术,它使用一个二进制算术编码器依据概率模型进行编码。

控制

  • 率控制算法(Rate Control):为了满足比特率的限制,H.264提供了率控制算法来调整压缩参数,从而平衡视频质量和文件大小。

NAL(Network Abstraction Layer)网络提取层

NAL 的主要目标是实现网络环境的抽象,它将VCL编码产生的数据包装成为一系列的 NAL units,以提供统一的接口适应不同的系统环境。网络抽象层不但使编码视频能适应各种传输协议和存储介质,而且还为错误恢复和包丢弃等网络友好特性的实现提供了可能。

NAL 单元(NAL Units)

H.264/AVC 的编码结果会被分割为一系列的 NAL 单元,每个 NAL 单元都有两部分组成,分别是一字节的 NAL 头和一个负载荷(Payload)。负载荷包含了编码的视频数据或者其他信息。

在 NAL 头中,最关键的字段是 NAL 单元类型(NAL Unit Type). 这个字段定义了 NAL 单元的功能,例如是否包含编码视频数据,或者是否为序列参数集(SPS)和图像参数集(PPS)等参数数据。

SPS 和 PPS

序列参数集(SPS)和图像参数集(PPS)是 H.264 视频的关键部分,它们包含了解码该视频所需的诸多参数信息。

SPS 包含了对整个视频流的描述,而 PPS 则包含对单个图像内编码信息的描述。对于解码器来说,它们是必不可少的。

NAL 单元的类型(NAL Unit Types)

除了包含视频数据的编码数据(Coded Slice)类别,还有其他一些重要的 NAL 单元类型,例如序列参数集、图像参数集、缩略图、辅助信息以及前向错误校正等等。

3. H264编码原理

视频压缩基础

  1. 数据冗余减少
  • 空间冗余:同一帧内相邻像素之间存在高度相似性,可以通过诸如离散余弦变换(DCT)等方法进行编码来减少重复信息。
  • 时间冗余:多个连续帧之间存在的相似性,可以通过帧间预测来减少。不需要完整编码每一帧,而是只编码与之前帧的差异。
  • 编码冗余:某些像素值或像素块在视频中出现的频次更高,可以使用变长编码减少这些常见模式的位数。
  1. 亮度和色度分量
  • 视频信号通常分为亮度(Y)和色度(UV或CbCr)分量。由于人眼对亮度的变化比色度变化更敏感,色度信息可以在较低的分辨率下进行采样(色度子采样,如4:2:0, 4:2:2等)。
  1. 量化
  • 量化是一个将连续的信号转变为有限数量级别的过程,这能够减小数据量,但也会引入量化噪声(失真)。
  1. 编码方法
  • 预测编码:利用视频序列中的空间和时间冗余。帧内预测利用同一帧内的数据进行编码;帧间预测利用前一个或多个帧来预测当前帧。
  • 变换编码:如离散余弦变换(DCT),它将图片分解为不同频率的成分,频率低的(重要)成分可以用少量的位来保留,而高频成分(通常包含了较少的重要信息)则可被丢弃或粗略表示。
  • 熵编码:如霍夫曼编码和算术编码,根据符号出现的概率分配不同长度的码字。
  1. 去块效应滤波
  • 一种在压缩过程后应用的滤波技术,旨在减少视觉上不愉快的块状伪影。
  1. 比特率控制(Rate Control)
  • 控制视频码流的大小,确保视频质量和码率均衡。
  1. 视频压缩标准
  • 如MPEG-2, MPEG-4, H.264/AVC, H.265/HEVC等,它们定义了不同的编解码技术和工具,来满足特定的视频应用需求。

常见视频压缩算法

  1. H.262/MPEG-2 Parts 1 and 2 (视频编码标准)
  • MPEG-2是一种用于广播级的标清电视(SDTV)和高清电视(HDTV)的早期视频和音频压缩标准,在DVD和数字卫星电视广播中常用。
  1. H.264/AVC (Advanced Video Coding)
  • H.264/AVC被广泛用于网络视频流,HDTV广播,和高清视频存储(如蓝光光盘)。
  1. H.265/HEVC (High Efficiency Video Coding)
  • H.265/HEVC提供比H.264更高的数据压缩率,以适应更高的分辨率,如4K和8K,同时保持相同的视频质量。
  1. VP9
  • VP9是Google开发的一种开源编码技术,被广泛用于YouTube,它提供了与H.265类似的压缩效率。
  1. AV1 (AOMedia Video 1)
  • AV1由联盟开放媒体(AOMedia)开发,旨在替代Google的VP9并与H.265/HEVC竞争。它提供了更高的压缩效率,但在复杂性和编码效率上更高。
  1. VP8
  • VP8是Google开发的另一个开源编码技术,它被设计用来与H.264竞争并被用于WebM格式。
  1. Theora
  • Theora是一种基于VP3的开源编码技术,最初由Xiph.Org开发,用于网络视频流。
  1. DivX / XviD
  • DivX和XviD都是基于MPEG-4 Part 2 AVC的编码技术,早期被广泛用于视频压缩和共享。

以上都是有损压缩算法,也就是说在压缩过程中,一些数据将被丢弃并不可能完全恢复。这在大多数情况下是可以接受的,因为它们设计为利用人眼对于图形的小细节不敏感的特性。然而,对于需要完整无损数据的场景(如医疗成像或科学分析),可能需要使用无损视频压缩技术,如HUFFYUV或FFV1。

YUV 图像

YUV是一种色彩编码方法,通常用于视频压缩和处理。在这种格式中,Y代表亮度分量(Luminance或Luma),而UV代表色差分量(Chrominance或Chroma)。YUV模型被设计用来适应人类视觉,因为人眼对亮度的敏感度要远高于色彩。下面详细解释一下YUV格式:

  1. 亮度(Y)
  • 亮度代表了图像的明暗程度,包含了黑白图像的主要信息。在彩色视频中,如果去掉色彩信息,剩下的黑白影像便是由亮度信号Y所表示的。
  1. 色差(UV)
  • 色差分量表示颜色的信息,U表示蓝色和亮度的差异,而V表示红色和亮度的差异。人眼对色度的分辨力比亮度要低,所以在视频压缩时可以对色度信息进行子采样(Subsampling)。
  1. 色度子采样
  • 常见的子采样包括4:4:4,4:2:2和4:2:0等比例。
  • 4:4:4代表没有子采样,每个Y都有对应的U和V分量。
  • 4:2:2代表水平方向上,每两个Y共享一个U和一个V。
  • 4:2:0最为常见,其中水平和垂直方向上,每四个Y共享一个U和一个V。
  1. 为什么使用YUV
  • 和RGB相比,YUV的好处在于它能够将亮度信息与色彩信息分离。因为人眼对亮度更敏感,所以可以保留完整的Y分量以保证较好的图像质量,而将UV分量进行子采样以减少数据量。
  1. 应用
  • YUV格式在很多视频处理环节中使用,包括捕获、编辑、压缩和传输。许多视频编解码器内部都是使用YUV格式处理图像。
  1. 转换
  • 在现代的数字设备中,图像通常在RGB和YUV之间进行转换。YUV适用于压缩和广播,而RGB主要用于显示。因此,在视频播放或者采集时,经常需要进行颜色空间的转换。
  1. 格式举例
  • YCbCr是YUV在数字系统中的具体实现,其中Cb代表蓝色分量,Cr代表红色分量。在模拟系统中用的是YPbPr

H264编码流程

以下是H.264编码的基本步骤:

  1. 帧预处理
  • 视频帧可能首先经过去噪、滤波等预处理步骤以提高编码效率。
  1. 颜色空间转换
  • 输入视频从RGB格式转换到YUV格式(通常为4:2:0子采样),因为YUV格式更适合于压缩。
  1. 帧内/帧间预测(Intra/Inter Prediction)
  • 帧内预测用于减少帧内的空间冗余,即一个帧中相邻像素的相关性。编码器使用已编码的像素预测当前块的像素值。
  • 帧间预测利用了视频序列中不同帧之间的时间冗余。编码器可以选择使用先前帧(P帧)或之前和之后的帧(B帧)来预测。
  1. 变换和量化
  • 使用离散余弦变换(DCT)或整数近似变换来将像素值从空间域转换到频率域。
  • 量化过程会舍去些细节以减少数据量,这一步是有损的。
  1. 熵编码
  • 量化后得到的数据会进一步通过熵编码进行压缩。H.264使用了两种熵编码方法之一:卡布拉克(CABAC)或卡福(CAVLC)。
  1. 去块效应滤波(Deblocking Filter)
  • 在压缩后的视频中,块状伪影会比较明显。去块效应滤波器可以平滑块之间的边界,改善视觉质量。
  1. 速率控制(Rate Control)
  • 根据可用的带宽或用户设定的比特率目标,编码器会调整量化参数来控制输出流的大小。
  1. 打包和传输
  • 最后编码后的数据会被组合成NAL单元(网络抽象层单元),随后封装到容器格式如MP4或者直接进行传输。
  1. 错误处理
  • H.264还有很多特性来处理数据传输过程中的错误,如网络容错特性等。

宏块划分/ 扫描

宏块是视频编解码器处理图像数据的基本单位,通常包括一块16x16像素的亮度信息(Y分量)以及相应的8x8色度信息(U和V分量),对于4:2:0子采样的YUV格式来说。

这种划分策略的一个主要原因是,宏块的大小(16x16像素)对于捕获相邻像素之间的相关性和运动变化是相当有效的。此外,宏块是许多编解码技术的基础,例如运动估计和补偿、变换编码、帧内/帧间预测等。

宏块扫描

视频编解码过程中需要对宏块进行扫描,并按照一定顺序进行编解码。一种常见的扫描方式是Z字形(zig-zag)扫描,它在大多数视频编解码标准(包括H.264和H.265)的变换编码中被用到。

Z字形扫描的目的在于将变换后的系数按照一定的模式排列,以便更好地利用高频系数的稀疏性进行编码。变换编码后的系数通常有一个特点,那就是低频系数的值通常比高频系数的值大。通过Z字形扫描,可以将这些大的低频系数和小的高频系数集中在一起,这对于后续的熵编码(如游程编码)来说非常有利。

划分子块

子块按照特定的编码标准和规则被划分,典型的子块大小包括8x8、8x4、4x8以及4x4等。例如,在H.264编码中,一个16x16的宏块可以被划分为不同大小的子块进行更精细的运动估计和补偿。

为什么要进行子块划分?

这是因为在视频中,运动和纹理变化通常在小的区域内发生。如果固定使用大的宏块进行编码,可能无法准确捕获图像的细节变化。通过更精细的子块划分,可以更好地适应图像的局部特性。

如何进行子块划分?

在编码过程中,编码器会对每个宏块进行分析,根据其内部的纹理和运动复杂性决定是否进行子块划分,以及如何划分。这通常涉及到一种权衡关系,更精细的划分可以获取更好的图像质量,但会产生更多的编码开销。

子块划分的影响?

子块划分对编码的影响主要有两方面:一方面,它可以改善编码的效果,提高视频质量;另一方面,它也会提高编码的复杂度,增加计算和编码的开销。

4. IDR帧和帧区别

音频帧

在音视频开发中,音频帧是指音频数据的一个独立单元。每一帧都包含了一定时间段内的音频样本,这些样本通常以一定的采样率(如44.1kHz、48kHz等)来表示。

音频帧的定义和重要性:

  1. 定义:音频帧是音频数据流中按时间划分的连续的数据块。它是编码和解码过程中处理的基本单元。
  2. 时间性:音频帧对应的是一段时间内的声音,而不是像视频那样按画面的。
  3. 采样率:每一帧所包含的样本数取决于采样率和帧的时间长度。
  4. 位深:音频的位深度(比如16-bit,24-bit等)决定了样本的动态范围。
  5. 重要性:在音频编码中,对音频帧的处理直接关系到编码的效率和质量。合适的帧长可以在延迟和压缩效率之间找到平衡。

音频帧在编码中的作用:

  • 编码过程:在编码过程中,原始音频会被切分成一帧帧的数据,每一帧会被独立编码。
  • 压缩:编码器会分析每一帧的音频内容,实现数据压缩,去除冗余信息,保留重要的音频特征。
  • 传输:在音频流传输时,音频帧的结构使得数据可以以流的形式在网络中传输,并保持音频的连续性和同步性。

音频帧与编解码器:

各种音频编解码器(如AAC,MP3等)的工作机制基于音频帧进行。这些编解码器依据帧来处理、压缩和解压音频数据,以实现高效率的音频传输和播放。

视频帧

在音视频开发中,视频帧是一个事实上的标准单元。每一帧代表一个静态的图像,连续的视频帧序列则构成了我们看到的动态影像。

视频帧的基本概念:

  1. 定义: 视频帧是视频流中的一个静态的图像样本,类似于电影胶片的一帧。在特定的帧率下播放一系列的视频帧,就能产生流畅的视觉效果。
  2. 帧率: 帧率指每秒钟显示的帧数。常见的帧率有24帧/秒、30帧/秒、60帧/秒等。帧率越高,我们看到的视频动态效果就越流畅,但相应地,所需要的数据量也会更大。

视频帧在编码和解码中的作用:

  • 编码过程:编码器会将连续的视频帧进行压缩,形成压缩的视频帧,这是一种对空间和时间的压缩。
  • 解码过程:解码器则会将压缩的视频帧解压到原始的视频帧,恢复成我们可以识别的视频图像。
  • 压缩类型:常见的视频压缩方式为频域压缩和基于运动估计的时间压缩,如H.264、HEVC(H.265)、VP9、AV1等。

视频帧的种类:

在现代的视频压缩标准中,通常有三种类型的帧:

  1. I帧:关键帧,可以独立解码,不依赖任何其他帧。
  2. P帧:向前预测帧,依赖前一帧的信息。
  3. B帧:双向预测帧,依赖前后两帧的信息。

视频帧的处理技术:

视频帧的处理技术包括但不限于帧插值、帧速率语义提升、视频质量增强、帧间压缩、超分辨率恢复等。这些处理旨在改进视频的视觉质量,尤其在带宽受限的情况下,如网络视频流媒体、在线会议等。

处理视频帧时,会面临诸多挑战,如怎样降低带宽需求、提高视频质量、降低延迟等。答案在于更加高效的编码技术和更加强大的视觉处理算法。

IDR帧

IDR帧(Instantaneous Decoder Refresh Frame)是视频编码中的一个术语,指的是一种特殊类型的帧,能够立即刷新解码器的状态。它是用于编码视频数据时的同步和恢复点。

在视频编码(如H.264或者HEVC/H.265等)过程中,为了提高压缩率,除了基于图像内容本身压缩外(空间压缩),还会通过预测技术来消除视频序列中时间上的冗余(时间压缩)。这种预测通常参考之前(甚至之后)的帧,以减少重复信息,这样就生成了P帧和B帧。

然而,如果依赖过长的帧序列,当丢失某一帧时,会影响后续全部帧的正确解码。此时IDR帧就显得尤为重要,因为它提供了一种机制,以“清除”解码器的状态并开始一个全新的序列。

IDR帧的关键点包括:

  1. 独立解码:IDR帧不依赖于之前的任何帧,可以独立被解码。
  2. 重同步:IDR帧可以用作同步点以便于在发生错误或损失时快速恢复视频流。
  3. 随机访问:它允许播放器快速寻找到这些帧,并从这些点开始播放,非常适用于视频搜索和跳转。

区别

IDR帧:
IDR帧是一种特殊类型的I帧。它们都是关键帧,这意味着它们不依赖于其他帧就可以完全独立解码。主要区别在于IDR帧在编码流中用作重同步点。

  • 重同步点:IDR帧用作播放时的重新同步的参照点,使得解码器可以无视之前的帧而开始解码,这在视频流中特别有用。
  • 错误恢复:如果视频传输过程中发生错误,IDR帧可以帮助快速恢复视频的正常播放。
  • 随机访问:IDR帧允许快速定位到视频流中的特定点开始播放,使其对于视频编辑和快速预览非常重要。

普通帧:
普通帧(非IDR I帧、P帧和B帧)依赖于其它帧来完整地解码。

  • I帧:虽然是关键帧,但它们不一定是重同步点。一段视频可以只在最开始有一个IDR帧,然后有若干个普通I帧。
  • P帧:向前预测帧,这些帧只使用以前帧(I帧或P帧)的信息来减少数据量。
  • B帧:双向预测帧,它们利用它们之前和之后的帧来进一步减少数据量。

5.动态修改编码码率

动态修改编码码率(Dynamic Bitrate Adaptation)是指根据网络条件、计算资源或视频内容的复杂性,在实时传输过程中动态调整视频编码器输出的数据速率的过程。

视频编码器产生的数据流(码流)需要根据带宽或设备处理能力的变化来调整,以确保视频数据可以有效传输,并在不同条件下维持尽可能好的视频质量。动态修改编码码率有以下几个关键方面:

  1. 实时监测:系统需要监测当前网络状况(如可用带宽、延迟、丢包率等)以及本地资源消耗(如CPU和内存使用率)。
  2. 码率调整策略:根据监测到的情况,编码器采取码率调整策略,或者由控制逻辑指定新的目标码率。这些策略可能基于贪婪算法、缓冲区状况、多利特率控制算法或者机器学习方法。
  3. 编码器响应:编码器依据新的码率设置,调整压缩参数,如量化级别、帧率或分辨率。这可能会减少帧内和帧间的细节,以适应更低的码率。
  4. 质量控制:为了保证视频质量,码率调整通常与质量评估机制(如SSIM或PSNR)一起工作,以防止过度压缩导致的质量不可接受。

动态修改编码码率是现代流媒体服务中常见的做法,例如在直播中,当网络波动时,系统需要调整码率以避免缓冲或中断。对于点播服务,也使用类似技术来适应不同用户的网络条件和设备性能。这种方法不仅提升了用户体验,同时也优化了网络资源的利用。

6. GOP间隔参考值

GOP是视频编码中的一个重要概念,全称是Group of Pictures,意为“图片组”或“帧组”。它是由连续的视频帧组成的一个序列,在这个序列中,通常包含一个I帧(关键帧)和随后的一些P帧与B帧。

GOP的起始点总是一个I帧,后面跟着一些P帧和B帧。每个GOP内的帧都依赖前一个I帧,但不依赖任何其它GOP中的帧。这样就能实现在视频流中查找最近的I帧,然后从那里开始解码。

GOP的长度和结构取决于编码方法和需要的视频质量。一般来说,长GOP可以提供更高的压缩率(因为包含更多的P帧和B帧),但可能会影响到视频处理(如快进、快退、跳跃播放等)的性能。相反,短GOP在视频处理性能方面表现更好,但压缩率低一些。因此,GOP的长度和结构需要根据具体应用来选择。

GOP间隔参考值

GOP间隔参考值是视频编码过程中设定的一个参数,它影响视频数据的压缩效率和质量。不同的应用场景和编码需求会有不同的参考值。

下面是一些常见的GOP参考值:

  1. 低延迟应用
  • 直播或实时通信通常要求低延迟,因此可能设定较短的GOP,比如1秒或者2秒(即每秒的帧数,例如30fps的直播视频可能设定为30或60作为GOP间隔)。
  1. 广播或流媒体
  • 对于电视广播或视频流服务,可以采用较长的GOP间隔来提高压缩率,这些间隔可能是8秒、10秒,或者更长。
  1. 存储和档案
  • 用于存储或归档的视频,可以接受较长的GOP,以最大化压缩并节省空间,可能会设置为10秒至30秒。
  1. 静态或低运动视频内容
  • 对于变化不大的场景,比如监控摄像,一个较长的GOP间隔也是可行的,可能设定为数分钟。
  1. 高运动视频内容
  • 对于运动量很大的视频内容,例如体育赛事,可能会设置较短的GOP来保持较高的图像质量,比如2秒至4秒。
  1. 具体编码标准
  • 根据不同的编码标准,如H.264或H.265,可能会有一些推荐的GOP配置。例如,H.264的Blu-ray编码通常推荐GOP不超过半秒(在24fps的情况下,GOP长度为12)。

7. 复用合成MP4音视频不同步问题

复用合成MP4音视频通常涉及到两个过程:音频和视频的复用(muxing)和解复用(demuxing)。复用是将音频流和视频流合并到同一个容器中,比如MP4文件。这是一个不涉及转码的过程,音频和视频数据本身不会被改变。相对的,解复用是将音视频文件分离成独立的音频流和视频流。

要进行复用合成MP4音视频,可以使用诸如FFmpeg这类的工具。以下是使用FFmpeg进行音视频复用的基本命令:

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

解释一下这条命令:

  • ffmpeg是调用FFmpeg工具的命令。
  • -i video.mp4指定输入的视频文件。
  • -i audio.mp3指定输入的音频文件。
  • -c:v copy表示视频编码器(codec)使用复制模式,即不编码。
  • -c:a aac表示音频编码器使用AAC编码,是MP4常用的音频编码之一。
  • -strict experimental是FFmpeg对于一些功能要求指定的选项,因为AAC编码在一些FFmpeg的版本中可能标记为实验性的。
  • output.mp4是输出文件的名称。

复用合成MP4音视频不同步问题

音视频不同步的问题通常指的是在播放时音频和视频的时间轴不一致,即音频可能滞后于视频或者领先于视频。在复用合成MP4文件时解决这种问题,通常要对音频或视频进行延迟或提前,以便与另一种媒体同步。以下是利用FFmpeg来解决这个问题的一些方法:

  1. 为音频添加延迟
    如果音频比视频早,你需要为音频添加延迟。使用FFmpeg的-itsoffset选项可以实现这一点:
ffmpeg -i video.mp4 -itsoffset 1 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

这个命令中的-itsoffset 1会为音频添加1秒的延迟。1可以按需要替换为实际需求的延迟秒数。

  1. 为视频添加延迟
    如果视频比音频早,则需要为视频添加延迟。你还是可以使用-itsoffset,但需要对选项的放置和操作有一定的调整:
ffmpeg -itsoffset 1 -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

这里-itsoffset放在了视频输入文件之前,意味着添加到视频上的延迟。

  1. 调整音频延迟
    如果你只想调整音频流的延迟(而不是整体的输入),可以使用af(audio filters)选项:
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -filter:a "atempo=1.0,asetpts=PTS+1/TB" -c:a aac output.mp4

filter:a中,atempo=1.0表明音频播放速度不变,而asetpts=PTS+1/TB会给音频添加1秒钟的延迟。

8. 编码、复用timebase问题

在编码和复用视频的过程中,有一个重要的术语叫做"timebase",也经常称为时间基准。在音视频编码和处理中,timebase是用来衡量时间进度的基本单位。时间基准通常用于标记帧在媒体流中的显示时间,也就是告诉播放器在什么时候显示某帧。

每一个编码器和解码器都有他们自己的timebase,它是由编码器决定的,并存在于编码的音视频流的元数据中。不同的编码器可能有着不同的timebase,FFmpeg的默认timebase通常为1/1000000,也就是说基本的时间单位是1微秒。

字幕流也有他们自己的timebase,比如说WebVTT和SRT,他们的基本时间单位通常是毫秒级别的。

在处理视频流(包括重新编码或者复用)时,需要注意各个流的timebase,尤其是在需要同步音频和视频或者插入字幕时。FFmpeg之类的工具会自动处理timebase,自动进行转换以标准化所有流的timebase。

若需要进行更深入的调整,要对timebase有比较充分的理解,以避免引入同步问题。例如,修改timebase可以改变视频播放的速度。更快的timebase会使视频播放得更快,而更慢的timebase则会使视频播放得更慢。不过需要小心,因为改变timebase可能会导致音视频不同步。

9. H264、H265编码互转

H.265

H.265,正式名称为High Efficiency Video Coding (HEVC),是一种视频压缩标准,是H.264/Advanced Video Coding (AVC)的后续者。H.265旨在提供比H.264更优的视频压缩,意味着它可以提供更高的视频质量但又不增加文件大小,或者在保持相同的视频质量的情况下显著减少文件大小。

H.265标准的关键特性包括:

  • 高效压缩:对比H.264,H.265能够将视频文件尺寸减少约50%,在不损失图像质量的情况下实现更高的数据压缩率。
  • 支持高分辨率:H.265支持高达8K UHD分辨率的视频流。
  • 网络友好:更小的文件尺寸让H.265编码的视频更容易通过网络传输,降低了网络带宽的要求。
  • 改进的画面质量:H.265引入了许多新技术,如更高效的编码树单元(CTUs)、改进的运动补偿和滤镜技术等,提升了画面质量。

H.265特点

H.265 或称为高效率视频编码 (HEVC) 是一项先进的视频压缩标准,它的技术特点主要包括:

  1. 高压缩效率
  • 相较于H.264/AVC,HEVC能提供大约两倍的数据压缩比,在保持相同画质的情况下,所需的码率大大减少。
  1. 支持高分辨率视频
  • 为了应对4K及以上分辨率的视频,HEVC支持高达8K(8192×4320)的分辨率,为高清视频的发展提供了技术支持。
  1. 增强的并行处理能力
  • HEVC设计了更有效的工具来允许并行处理,比如tiles(瓦片),使得编码过程能够更好地分配到多核处理器上。
  1. 编码树单元 (Coding Tree Unit, CTU)
  • CTUs类似于H.264中的宏块,但能处理更多的数据,允许更加细致的调整以适应不同类型的视频内容。
  1. 更多的预测单元和变换单元大小
  • HEVC引入了更灵活的预测单元 (Prediction Unit, PU) 和变换单元 (Transform Unit, TU) 来适应不同内容的视觉特征,这也进一步提高了编码效率。
  1. 改进的运动补偿和预测技术
  • 包括高精度的运动矢量预测、motion vector competition和更广泛的intra prediction角度等。
  1. 编码质量的提升
  • 通过一系列算法优化(例如采样自适应偏移 (SAO) 和去块滤波 (Deblocking filter)),减少了视觉上的失真和块效应。
  1. 多帧参考
  • HEVC允许更多的帧做为运动补偿的参考,这样可以利用视频序列之间的相关性提高编码效率。
  1. 更强的误码恢复能力
  • 使用波前并行处理(WPP)和切片分割提高了数据流的鲁棒性,特别是在网络传输中。

编码互转

将H.264编码的视频转换为H.265编码,或者将H.265转换为H.264,主要涉及视频转码过程。视频转码是指将视频文件从一种编码格式转换为另一种编码格式。这通常包括解码原始格式的视频流然后再对其进行编码为目标格式。

对于H.264与H.265的互转,以下是相关技术步骤:

H.264转H.265:

  1. 解码H.264视频流:首先需要使用解码器(例如FFmpeg中的libavcodec)将H.264编码的视频解码为未压缩的原始视频帧。
  2. 编码为H.265视频流:然后使用H.265编码器(例如x265或者FFmpeg中的libx265)将未压缩的视频帧编码成H.265格式。在这个过程中,可以设置不同的参数以改善压缩效率、画质或编码速度。
  3. 封装:将编码后的视频流封装到媒体容器中(如MP4或MKV),也可以同时封装音频流和字幕等其他数据。

H.265转H.264:

  1. 解码H.265视频流:使用H.265解码器将H.265编码的视频解码为未压缩的原始视频帧。
  2. 编码为H.264视频流:使用H.264编码器(如x264或FFmpeg中的libx264)将未压缩的视频帧编码成H.264格式。
  3. 封装:与H.264转H.265的过程类似,将编码后的视频流封装到合适的媒体容器文件中。

这个转码过程会导致视频质量下降,因为每一次编解码操作都有可能造成数据损失,特别是如果使用有损压缩。此外,转码也是一个计算密集型任务,尤其是转换为H.265,需要有足够的计算资源。

在现实操作中,可以使用如FFmpeg这样的强大工具来实现转码,如:

# H.264转H.265
ffmpeg -i input.mp4 -c:v libx265 -preset medium -x265-params crf=28 output.mp4

# H.265转H.264
ffmpeg -i input.mp4 -c:v libx264 -preset medium -x264-params crf=23 output.mp4

以上命令中,-preset 参数控制编码的速度和压缩率的权衡,-crf 参数控制输出视频的质量和文件大小的权衡。