音视频开发_FFmpeg音视频编码

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。
    • 广泛兼容、低处理复杂度且音质良好。
    • 适合用于现代数字音频播放。
  2. HE-AAC (High Efficiency AAC, aka AAC+):

    • 增加了Spectral Band Replication (SBR)。
    • 用于流媒体和广播,特别是在比特率较低时能够保持较好的音质。
  3. HE-AAC v2 (aka eAAC+):

    • HE-AAC的延伸,增加了Parametric Stereo (PS)。
    • 针对单声道信号提供立体声编码,适合极度低比特率的应用。
  4. AAC-LD (Low Delay AAC):

    • 针对实时通讯设计,如视频会议。
    • 低延迟,但比特率比AAC-LC高。
  5. AAC-ELD (Enhanced Low Delay AAC):

    • 结合了AAC-LD和SBR技术。
    • 用于需要高质量和超低延迟的实时应用,如远程音乐表演。
  6. MPEG 2 AAC-LC:

    • MPEG 2标准中的AAC。
    • 较为早期的AAC实现,和MPEG 4 AAC-LC相似。
  7. MPEG 2 AAC-SSR (Scalable Sample Rate):

    • 可伸缩采样率。
    • 较少使用,主要在特定需要中实现。
  8. MPEG 2 AAC-PS (Parametric Stereo):

    • 并不是一个完整的profile,而是HE-AAC的一部分。
    • 用于立体声信号的更高效编码。
  9. MPEG 4 AAC-LTP (Long Term Prediction):

    • 引入了长时预测编码。
    • 被认为有较高的编码效率,但不如AAC-LC广泛支持。
  10. 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 (DAS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值