前言

本文作为开篇,主要以问答的形式,介绍一些音频开发的基础常识,非常重要,因为不了解这些常识,很多 Android API 或者第三方库的参数,你都不知道该怎么配置。

主要应用

音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱等。

具体内容

(1)音频采集/播放

(2)音频算法处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离,等等)

(3)音频的编解码和格式转换

(4)音频传输协议的开发(SIP,A2DP、AVRCP,等等)

难点

延时敏感、卡顿敏感、噪声抑制(Denoise)、回声消除(AEC)、静音检测(VAD)、混音算法等。

基础概念

  • 采样率(samplerate)
    采样就是把模拟信号数字化的过程,不仅仅是音频需要采样,所有的模拟信号都需要通过采样转换为可以用0101来表示的数字信号,示意图如下所示:

    说明:
  • 蓝色代表模拟音频信号,红色的点代表采样得到的量化数值。
  • 采样频率越高,红色的间隔就越密集,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。
  • 根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。

通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

  • 量化精度(位宽)
    上图中,每一个红色的采样点,都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit等,位数越多,表示得就越精细,声音质量自然就越好,当然,数据量也会成倍增大。
    常见的位宽是:8bit 或者 16bit
  • 声道数(channels)
    由于音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。
    单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2
  • 音频帧(frame)
    音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。

常见的音频编码方式

模拟的音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCMADPCM,这些数据代表着无损的原始数字音频信号,添加一些文件头信息,就可以存储为 WAV 文件了,它是一种由微软和 IBM 联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。

我们在音频开发过程中,会经常涉及到 WAV 文件的读写,以验证采集、传输、接收的音频数据的正确性。

常见的音频压缩格式

MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR等。

Adndroid VoIP相关的开源应用

imsdroid,sipdroid,csipsimple,linphone,WebRTC 等

音频算法处理的开源库

speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC)

Android 提供了哪些音频开发相关的 API?

  • 音频采集: MediaRecoder,AudioRecord
  • 音频播放: SoundPool,MediaPlayer,AudioTrack (它们之间的区别可以参考 这篇文章)
  • 音频编解码: MediaCodec
  • NDK API: OpenSL ES

音频开发的延时标准

ITU-TG.114 规定,对于高质量语音可接受的时延是 300ms。一般来说,如果时延在300~400ms,通话的交互性比较差,但还可以接受。时延大于 400ms 时,则交互通信非常困难。