【Android音视频开发】音频编码原理

文章变更表

文章版本号 变更内容 变更日期 备注
0.0.1 创建 2022/9/29 初版
0.0.2 补充编码原理和音频格式等内容 2022/9/30

1. 前言

在【Android音视频开发】 这一系列文章的开头,介绍一下音视频编码的原理是很有必要的,有利于对后续出现的概念的理解。此处先讲音频,视频编码的原理将在另一篇文章中讲述。

2. 正文

2.1 声音的本质

声音的本质是在介质中传递的声波,既然是一种波,那么它就会具有以下几个波的特征:频率、振幅和波长。频率越大声音越尖细,振幅越大声音越洪亮。

2.2 声音的数字化

自然界中的声音波形都是连续的,称为模拟音频(模拟信号),人们通过收音设备采集到的模拟信号,会以0、1这样的二进制数据进行存储,通过这种形式存储的音频称为数字音频(数字信号)。下面介绍一下采样的概念和几个描述数字音频的关键参数。

  • 采样:将模拟音频通过收音设备进行采集,从而得到数字音频的过程称为“采样”。
  • 采样率:单位时间(1秒)内对模拟音频采集的次数称为“采样率”,采样率越大,声音的还原度越高、越真实,常见的采样率有16kHz、44.1kHz和48kHz。
  • 采样位数:可以理解数字音频设备处理声音的解析度,即对声音的辨析度。就像表示颜色的位数一样(8位表示256种颜色,16位表示65536种颜色),有8位,16位,24位等。这个数值越大,解析度就越高,录制和回放的声音就越真实。
  • 比特率:表示单位时间(1秒)内传送的比特数bps(bit per second,位/秒)的速度。作为一种数字音乐压缩效率的参考性指标,通常使用kbps(通俗地讲就是每秒钟1024比特)作为单位。

2.3 音频编码的重要性

根据2.2中提到的概念,我们可以得到一个数字音频文件占用空间大小的算法,用S表示占用存储空间大小的话,S=(采样率x采样位数x声道数)/8x音频时长。

假设现在有一段音频,采样率为44.1KHZ,采样位数为16位,左右双声道(立体声),时长为5分钟。那么它占用存储空间的大小S=(44100162)/8*(5*60)=52920000字节,转为MB为 52920000/1024/1024≈50.47MB(兆字节),也就是说,我们存储这样一段5分钟的音频就需要占用50MB的空间,这在大容量存储设备普及前以及传输带宽很小的古早时期是很难接受的,因此对数字音频进行编码的需求迫在眉睫。

2.4 编码原理

数字音频压缩编码是在保证信号在听觉方面不产生失真的前提下,对音频数据信号尽可能大的压缩,降低数据量。数字音频压缩编码采取去除声音信号中的冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,即[20, 20k]Hz以外频率的信号,这些信号对确定声音的音色,音调等信息没有任何的帮助。

此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所遮蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。

2.4.1 频谱掩蔽效应

【Android音视频开发】音频编码原理_第1张图片
一个频率的声音音量(db)小于某个阈值,人耳就会听不到。当有另外能量较大的声音出现的时候,该声音频率附近的阈值就会提高很多,即所谓的掩蔽效应,如上图所示。

由图中我们可以看出人耳对2KHz~5KHz的声音最敏感,而对频率太低或太高的声音信号都很迟钝,当有一个频率为0.2KHz、强度内60db的声音出现时,其附近的阈值提高了很多。
由图中我们可以看出在0.1KHz以下、1KHz以上的部分,由于离0.2KHz强信号较远,不受0.2KHz强信号影响,阈值不受影响。而在0.1KHz-1KHz范围,由于0.2KHz强音的出现,阈值有较大的提升,人耳在此范围所能感觉到的最小声音强度大幅提升。如果0.1KHz-1KHz范围内的声音信号的强度在被提升的阈值曲线之下,由于它被0.2KHz强音信号所掩蔽,那么此时我们人耳只能听到0.2KHz的强音信号而根本听不见其它弱信号,这些与0.2KHz强音信号同时存在的弱音信号就可视为冗余信号而不必传送。

20hz和20khz左右音量需要非常大才能听见,如果在0.2khz时音量很大,就会出现掩蔽效应,即在0.2khz音量很大的点的附近频率的声音也需要很大才能听得见。于是我们不需要编码掩蔽阈值以下部分的声音,因为这部分的声音人很难听到。

2.4.2 时域掩蔽效应

在强音和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。
【Android音视频开发】音频编码原理_第2张图片

  • 前掩蔽
    人耳在听到强信号之前的短暂时间内,已经存在的弱信号或被掩蔽而听不到

  • 同时掩蔽
    当强信号与弱信号同时存在时,弱信号会被强信号所掩蔽而听不到

  • 后掩蔽
    强信号消失后,需经过较长的一段时间才能重新听见弱信号

这些被掩蔽的弱信号可以视为冗余信号。

突然有强音,这时弱信号听不见
强音消失后一段时间后才能听见弱信号

2.5 压缩编码方法

当前数字音频编码领域存在不同编码方案和实现方式,基本编码思路大同小异,如图所示:
【Android音视频开发】音频编码原理_第3张图片
对每一个音频声道中的音频采样信号进行以下处理:

  1. 将他们映射到频域中,这种时域到频域的映射可通过子带滤波器实现。每个声道中的音频采样块首先要根据心理声学模型来计算掩蔽门限值(人耳对1kHz-7kHz较为敏感)
  2. 由计算出的掩蔽门限值决定从公共比特池中分配给该声道不同频率域中多少比特数,接着进行量化以及编码工作
  3. 将控制参数及辅助数据加入数据之中,产生编码后的数据流

2.6 常用音频编码格式

这里只介绍两种在开发中用的比较多的音频编码格式:PCMAAC

2.6.1 PCM

PCM全称Pulse-Code Modulation,翻译一下是脉冲调制编码。在音视频中,PCM是一种用数字表示采样模拟信号的方法。
要将一段音频模拟信号转换为数字表示,包含如下三个步骤:

  1. Sampling(采样)
  2. Quantization(量化)
  3. Coding(编码)

2.6.2 AAC

AAC,全称Advanced Audio Coding,中文名:高级音频编码,是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。苹果ipod、诺基亚手机支持AAC格式的音频文件。

优点:相对于mp3,AAC格式的音质更佳,文件更小。

不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在“本质上”的差距。加之,传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上“小巧”的光环不复存在。

2.7 音频帧长

其实,音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一副图像。但音频帧跟编码格式相关,它是各个编码标准自己实现的。因为如果以PCM(未经编码的音频数据)来说,它根本就不需要帧的概念,根据采样率和采样精度就可以播放了。

比如采样率为44.1kHZ,采样精度为16位的音频,你可以算出bitrate(比特率)是44100 x 16kbps,每秒的音频数据是固定的44100 x 16 / 8 字节。

对采样率为44.1kHz的AAC(Advanced Audio Coding)音频进行解码时,一帧的解码时间须控制在23.22毫秒内。通常是按1024个采样点为一帧。

2.8 音频播放过程

播放音乐时,应用程序从存储介质中读取音频数据(MP3、WMA、AAC),进过解码后,最终送到音频驱动程序中的就是PCM数据,反过来,在录音时,音频驱动不停地把采样所得到的PCM数据送回给应用程序,由应用程序完成压缩、存储等任务。所以,音频驱动的两大核心任务就是:

playback:把用户空间的应用程序发过来的PCM数据,转化为人耳可以辨别的模拟音频。

capture:把mic拾取得到的模拟信号,经过采样、量化,转化为PCM信号送回给用户空间的应用程序。

参考文献

  1. 模拟音频与数字音频
  2. 音频采样位数,采样率,比特率
  3. 音频处理——音频编码原理简介
  4. 常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

你可能感兴趣的:(Android音视频开发,音视频,音频,视频编解码)