首先,声音是如何形成的?声音就是 介质振动 在听觉系统中产生的反应,其中有两个非常重要的属性
- 振幅:声音的振幅就是音量
- 频率:声音的频率就是音调的高低单位 Hz

音频又分为:
- 模拟音频:上图蓝色曲线,在时间和振幅都是连续的。比如:磁带,唱片等。
- 数字音频:上图红色点,通过采样和量化获得离散性数据。比如:CD,MP3 等数字格式。
通过上图来介绍一下几个基础的概念:
- 采样率 Sampling Rate:单位时间内的采样点,即上图一个区间内红点的个数,单位为 kHz,每秒千个采样。(采样率越高越接近声音真实的频率)
- 量化深度 Depth :每个样本的二进制位数,即上图红点的 Y 坐标的值,位数越多,振幅能区分的更细,通常量化深度为 4,8,16,32 bit
- 声道数 Channel Num :每次生成一个采样数据,为单声道,多个声道可以重现出声音的位置。
对声音进行采样、量化过程被称为脉冲编码调制(Pulse Code Modulation),简称PCM。PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大,为了解决这个问题先后诞生了一系列的音频格式,这些音频格式运用不同的方法对音频数据进行压缩,其中有无损压缩(ALAC、APE、FLAC)和有损压缩(MP3、AAC、OGG、WMA)两种。
人耳听到的是模拟信号,PCM是把声音从模拟信号转化为数字信号的技术。
是的,我们通常说的音频格式,amr,aac, mp3其实就是指的 音频压缩格式 Audio Coding Format :如 MP3, AFLAC,FLAC等
播放音频
既然有这么多音频压缩类型了,我们只能用其中的一种或者几种,因此,我针对目前客户端内流通的音频类型,做了一个调查,如下
音频类型的选型
压缩格式多种多样,压缩率越高,体积就越小,但是音质就越差; 压缩率越低,体积就越大,也就越接近真实音质。所以,我们需要找到一个平衡
咱们的业务中(客户端,平台,以及后台业务)中一共涉及到了三种音频类型,最早的应该是 AMR,然后就是语音房那边的 Mp3,再到客户端提出的 AAC,下面一种一种开始介绍
AMR
什么是AMR?AMR(Adaptive Multi-Rate)自适应多速率音频压缩音频编码格式,是一个使语音编码最优化的专利,专用于有效地压缩语音频率。是 一种应用在手机上的一种语音压缩格式,也就是说我们用手机录音而成的文件就是这种格式的,或者一些彩铃都是这种格式的,体积小,音质要求不高
优点
- AMR-NB(AMR-NarrowBind),也就是常说的AMR窄带,语音带宽范围:300-3700Hz,8KHz采样频率,每20ms编码一帧,每个帧中包含160个语音样点;
- AMR-WB(Adaptive Multi-Rate - Wideband Speech Codec),也就是常说的AMR宽带,语音带宽范围50-7000Hz,16KHz采样频率。但考虑语音的短时相关性,每帧长度均为20ms;
- AMR-WB+(Extended Adaptive Multi-Rate - Wideband Speech Codec):amr-nb和amr-wb都属于speech codec,对audio的编码效果并不好,为了提高对audio的编码效果,出现了amr-wb+。amr-wb+可以支持更高的采样率,对speech和audio采用不同的编码算法,对speech采用ACELP编码,对audio采用变换编码。amr-wb+在低比特率上对audio的编码效果与he aac+相当。amr-wb+包含amr-wb,但复杂度更高。
AMR-NB一共有16种编码方式。0-7对应8种不同的编码方式,每种编码方式的采样频率不同;8-15 用于噪音或者保留用。
AMR-WB支持9种不同的编码方式:6.6kb/s、8.85kb/s、12.65kb/s、14.25kb/s、15.85kb/s、18.25kb/s、19.85kb/s、23.05kb/s、23.85kb,提供的语音带宽范围达到50~7000Hz,人声感觉比以前更加自然、舒适和易于分辨。
这个简单介绍一下,大家不需要深入了解,之后的代码里应该会提到这个
MP3
MP3 是著名的有损音频压缩编码方式 (FLAC,著名的 无损音频压缩编码,它不会破坏任何原有的音频资讯,所以可以完美地还原音乐光盘音质)
MP3是利用MPEG Audio Layer 3的技术,将音乐以1:10甚至1:12 的压缩率,压缩成容量较小的file,换句话说,能够在音质丢失很小的情况下把文件压缩到更小的程度。而且还非常好的保持了原来的音质。
优点
-
缺点
MP3 在 128KBitrate 及以下时,会出现明显的高频丢失
AAC
Advanced Audio Coding。翻译过来就是高级音频编码,一种专为声音数据设计的文件压缩格式,目的是取代MP3格式, 与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低aac标准的前提下,更加小巧。
AAC编码的主要扩展名有三种:.AAC, .MP4, .M4A
优点
- AAC是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法,如AC-3、MP3等。并且其质量可以同未压缩的CD音质相媲美。
- 相对于mp3,AAC格式的音质更佳,文件更小。
AAC支持更宽的声音频率范围,最低可达8KHz, 最高可达到96kHz,远宽于MP3的16KHz-48kHz的范围。
缺点
设备支持率和普及率低于mp3
- 属于有损压缩,与APE、FLAC等无损格式相比,音质有“本质上”差距,同时USB3.0和大容量存储空间等技术的普及,AAC的优势不明显。
为什么这么说呢?以前可能一部手机的存储空间不足,想要听更多数量的歌,那就必须进行压缩,把质量降低,数量提升,现在动不动就是128G,256G的手机,各种原声,黑胶唱片等等的音质,真的是想存多少存多少,也就没有必要去压缩音频了
WAV
这里额外介绍一种格式,在之后的解码音频的时候,最终会 统一转成 wav 进行播放(微软公司Microsoft 开发)WAV是录音时用的标准的windows文件格式,文件的扩展名为“.wav”,WAVE文件作为最经典的Windows多媒体音频格式,应用非常广泛。
优点
WAV是最接近无损的音乐格式,所以文件大小相对也比较大,早期的时候压缩方式不多,几乎都是wav。

音质和压缩比对比
压缩比
aac>ogg>mp3(wma)>ape>flac>wav(同一音源条件下)
mp3和wma以192kbps为分界线,192kbps以上mp3好,192kbps以下wma好。
音质比较:
硬件支持比较:
MP3播放器:mp3>wma>wav>flac>ape aac ogg
手机:mp3>wma>aac wav>flac ogg>ape
选型之后开始解码播放
下面我会分成两部分来进行说明,一个是H5播放,一个是后台播放
H5页面
H5页面的音频播放目前有两种方案,一个是客户端辅助播放,一个是H5自主播放
与客户端通信进行播放【目前大部分页面采用的方式】
H5 自主播放音频
所以这里的一个重要思路就是 传输/保存的时候,使用的是较合适的压缩格式;然后解码,重新编码 成 wav格式 来播放,就做到了兼顾音质和兼容性双方。
文件缓存,加载速度优化
文件体积大
解决方案:
- 进行gzip压缩,减小文件体积
- 传到CDN服务器上,缩短初次加载时间
文件存在缓存
由于.min.js 如果放到src 下,eslint校验以及代码格式化工具都会影响内部代码,因此只能放到 common的文件夹下,这样就不会走webpack打包和相关校验了,可以直接引入
但是这样就造成了一个问题,我如果修改了一些功能,然后再次生成 .min.js ,发布到jenkins 上之后,手机再次打开页面,由于和之前的文件名一模一样,因此浏览器会选择走缓存,导致新页面用的旧功能
解决方案:
- 引入文件的适合,手动加后缀
- document.write() 可以一劳永逸,但是不安全
后台
后台的话,限制就少很多, 毕竟PC端的浏览器,移动端的浏览器/webView和 这个 比起来性能,兼容性,局限性不是一个层次的,之前移动端需要顾虑的一些问题,到了这里,就不再是问题了
录音相关
时间够的话,来简单讲一录音相关的业务场景以及技术方案
目前,客户端内的录音,主要方式依然是依赖客户端
H5页面录音(依赖客户端)
H5自主录音(暂未投入使用)
目前存在较多兼容性的问题,头大



