文章变更表

文章版本号 变更内容 变更日期 备注
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 频谱掩蔽效应


一个频率的声音音量(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 时域掩蔽效应

在强音和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。

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

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

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

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

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

2.5 压缩编码方法

当前数字音频编码领域存在不同编码方案和实现方式,基本编码思路大同小异,如图所示:

对每一个音频声道中的音频采样信号进行以下处理:

  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音视频开发】音频编码原理相关推荐

  1. Android音视频开发-音频篇-音频的原理

    致知在格物,物格而后知至.所谓致知在格物者,言欲致吾之知,在即物而穷其理也 意思讲的是要探究事物的原理,从而获得智慧. 写代码也是如此,只有了解其中的原理,才能运用自如 所以我们要想学好Android ...

  2. 直播平台源码搭建教程之Android音视频开发

    直播平台源码搭建教程之Android音视频开发 音频 将声音保存成音频的过程,其实就是将模拟音频数字化的过程,为了实现这个过程,就需要对模拟音频进行采样.量化和编码.接下来我们详细讲解这一过程. 采样 ...

  3. Android音视频开发,详说PCM音频重采样、PCM编码

    直播伴音,两种数据能否合在一起?不能叠加在一起 会有噪音 合并以后 再去编码推流 直播的例子 客户端播放器,可以开启多个播放器 对于我们重采样 很多时候就是为了统一格式,就是为了要合并这个流,去推送, ...

  4. Android 音视频开发(一):PCM 格式音频的播放与采集

    什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...

  5. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)

    关于 AudioRecord Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风 ...

  6. Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

    前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...

  7. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片

    想要逐步入门音视频开发,就需要一步步的去学习整理,并积累.本文是音视频开发积累的第一篇. 对应的要学习的内容是:在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView ...

  8. Android音视频开发之音频录制和播放

    Android音视频开发之音频录制和播放 1.封装音频录制工具类: public class RecorderAudioManagerUtils {private static volatile Re ...

  9. 那些年,Android音视频开发那些事儿

    音视频开发的主要应用有哪些? 音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等 1.视频监控类 (JNI+应用层开发) 从硬件到嵌入式再到软件,涉 ...

最新文章

  1. 反汇编最基础知识(段寄存器和寄存器的说明)
  2. 音视频技术开发周刊 | 178
  3. C++11系列学习之四----auto
  4. mysql员工脚本_mySQL常用脚本汇总
  5. 天凉了,大家多穿衣服
  6. 我的世界1.6.2 java_我的世界Java版1.16.2
  7. MATLAB案例学习-基于雷达和摄像头的传感器融合
  8. 【2017-3-2】集合 结构体 枚举
  9. 【转载】4412开发板、PC、ubuntu通过网线连接
  10. js特效之上下翻页相册效果
  11. 使用fastcgi_cache加速你的Nginx网站
  12. vim 配置快捷键映射
  13. excel按拼音顺序排序_如何在Excel中按字母顺序排序工作表选项卡
  14. 魔兽世界服务器同时在线人数,魔兽世界服务器人数,魔兽世界服务器人数查询...
  15. 如何快速定位 Redis 热 key
  16. Codeforces Global Round 21) C. Fishingprince Plays With Array
  17. VM16虚拟机去虚拟化心得2
  18. 【配置】利润中心会计启用
  19. 在PRESS.one这片蛮荒沃土上,我们都是拓荒者
  20. PMP备考大全:经典题库(敏捷管理第16期)

热门文章

  1. python imread的用法_Python imread、newaxis用法详解
  2. 马云对话80、90后:永远保持乐观
  3. mysql before insert_before 和 insertBefore 方法
  4. 五个简单的 Requests 库爬虫实例
  5. MyBatis学习:MyBatis的配置文件
  6. python Flask logging日志报错“另一个程序正在使用此文件,进程无法访问”
  7. D:\……R.jar: 另一个程序正在使用此文件,进程无法访问。
  8. LeetCode 63
  9. 为什么微博签到数据如此受欢迎?
  10. zynq板zedboard+vitis设计(二)AXI DMA