先来点闲言碎语,前段时间我有一段感悟:Android开发,自己并非一个能够走得多远的方向,它只是一个平台,提供了许多封装好的API,让你们可以快速开发出针对特定业务的应用。前端
真正有价值的地方就在于Android与具体的业务方向结合,好比:Android与音视频技术,Android与智能硬件交互,Android与前端技术的融合与探索,Android信息安全,Android源码深度定制等等。android
我一直比较看好音视频/多媒体方向,但愿在此可以深刻积累和探索,前段时间我发布了一款Android VoIP网络电话应用“飞鸽电话”,并写了一篇分析其总体架构的文章《PigeonCall:一款Android VoIP网络电话App架构分析》,欢迎有兴趣的小伙伴们先看一看。web
在这个应用的开发过程当中学到的东西还蛮多的,所以想写一些文章分享分享,本文做为开篇,主要以问答的形式,介绍一些音频开发的基础常识,很是重要,由于不了解这些常识,不少Android API或者第三方库的参数,你都不知道该怎么配置。算法
1. 音频开发的主要应用有哪些?安全
音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等。微信
2. 音频开发的具体内容有哪些?网络
(1)音频采集/播放架构
(2)音频算法处理(去噪、静音检测、回声消除、音效处理、功放/加强、混音/分离,等等)ide
(3)音频的编解码和格式转换post
(4)音频传输协议的开发(SIP,A2DP、AVRCP,等等)
3. 音频应用的难点在哪?
延时敏感、卡顿敏感、噪声抑制(Denoise)、回声消除(AEC)、静音检测(VAD)、混音算法,等等。
4. 音频开发基础概念有哪些?
在音频开发中,下面的这几个概念常常会遇到。
(1) 采样率(samplerate)
采样就是把模拟信号数字化的过程,不只仅是音频须要采样,全部的模拟信号都须要经过采样转换为能够用0101来表示的数字信号,示意图以下所示:
蓝色表明模拟音频信号,红色的点表明采样获得的量化数值。
采样频率越高,红色的间隔就越密集,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。
根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就能够无损失地还原原始的声音。
一般人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。经常使用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。
(2) 量化精度(位宽)
上图中,每个红色的采样点,都须要用一个数值来表示大小,这个数值的数据类型大小能够是:4bit、8bit、16bit、32bit等等,位数越多,表示得就越精细,声音质量天然就越好,固然,数据量也会成倍增大。
常见的位宽是:8bit 或者 16bit
(3) 声道数(channels)
因为音频的采集和播放是能够叠加的,所以,能够同时从多个音频源采集声音,并分别输出到不一样的扬声器,故声道数通常表示声音录制时的音源数量或回放时相应的扬声器数量。
单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2
(4) 音频帧(frame)
这个概念在应用开发中很是重要,网上不少文章都没有专门介绍这个概念。
音频跟视频很不同,视频每一帧就是一张图像,而从上面的正玄波能够看出,音频数据是流式的,自己没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,通常约定俗成取2.5ms~60ms为单位的数据量为一帧音频。
这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编×××和具体应用的需求来决定的,咱们能够计算一下一帧音频帧的大小:
假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:
int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte
5. 常见的音频编码方式有哪些?
上面提到过,模拟的音频信号转换为数字信号须要通过采样和量化,量化的过程被称之为编码,根据不一样的量化策略,产生了许多不一样的编码方式,常见的编码方式有:PCM 和 ADPCM,这些数据表明着无损的原始数字音频信号,添加一些文件头信息,就能够存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,能够很容易地被解析和播放。
咱们在音频开发过程当中,会常常涉及到WAV文件的读写,以验证采集、传输、接收的音频数据的正确性。
6. 常见的音频压缩格式有哪些?
首先简单介绍一下音频数据压缩的最基本的原理:由于有冗余信息,因此能够压缩。
(1) 频谱掩蔽效应: 人耳所能察觉的声音信号的频率范围为20Hz~20KHz,在这个频率范围之外的音频信号属于冗余信号。
(2) 时域掩蔽效应: 当强音信号和弱音信号同时出现时,弱信号会听不到,所以,弱音信号也属于冗余信号。
下面简单列出常见的音频压缩格式:
MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等
7. Adndroid VoIP相关的开源应用有哪些 ?
imsdroid,sipdroid,csipsimple,linphone,WebRTC 等等
8. 音频算法处理的开源库有哪些 ?
speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC),等等
10. Android提供了哪些音频开发相关的API?
音频采集: MediaRecoder,AudioRecord
音频播放: SoundPool,MediaPlayer,AudioTrack (它们之间的区别能够参考这篇文章)
音频编解码: MediaCodec
NDK API: OpenSL ES
11. 音频开发的延时标准是什么?
ITU-TG.114规定,对于高质量语音可接受的时延是300ms。通常来讲,若是时延在300~400ms,通话的交互性比较差,但还能够接受。时延大于400ms时,则交互通讯很是困难。
12. 小结
音频开发的知识点其实挺多的,一篇文章也没法详细地展开叙述,所以,不够全面和详尽的地方,请你们搜索专业的资料进行深刻了解。文章中有不清楚的地方欢迎留言或者来信 lujun.hust@gmail.com 交流,或者关注个人新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。