【轉】Android音频开发(1):基础知识

news/2024/7/5 3:28:18

为什么80%的码农都做不了架构师?>>>   hot3.png

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/1748506

先来点闲言碎语,前段时间我有一段感悟:Android开发,本身并不是一个可以走得多远的方向,它只是一个平台,提供了许多封装好的API,让大家能够快速开发出针对特定业务的应用。


真正有价值的地方就在于Android与具体的业务方向结合,比如:Android与音视频技术,Android与智能硬件交互,Android与前端技术的融合与探索,Android信息安全,Android源码深度定制等等。


我一直比较看好音视频/多媒体方向,希望在此能够深入积累和探索,前段时间我发布了一款Android VoIP网络电话应用“飞鸽电话”,并写了一篇分析其整体架构的文章《PigeonCall:一款Android VoIP网络电话App架构分析》,欢迎有兴趣的小伙伴们先看一看。


在这个应用的开发过程中学到的东西还蛮多的,因此想写一些文章分享分享,本文作为开篇,主要以问答的形式,介绍一些音频开发的基础常识,非常重要,因为不了解这些常识,很多Android API或者第三方库的参数,你都不知道该怎么配置。


1. 音频开发的主要应用有哪些?


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


2. 音频开发的具体内容有哪些?


(1)音频采集/播放

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

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

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


3. 音频应用的难点在哪?


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


4. 音频开发基础概念有哪些?


在音频开发中,下面的这几个概念经常会遇到。


(1) 采样率(samplerate)


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


wKioL1bdXQviw_TBAAAVYm_x3gk862.gif


蓝色代表模拟音频信号,红色的点代表采样得到的量化数值。


采样频率越高,红色的间隔就越密集,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。


根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。


通常人耳能听到频率范围大约在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 获取最新的文章和资讯。

wKiom1bdXr-BXKLtAACb8XAe6Uo863.jpg

本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1748506


转载于:https://my.oschina.net/ggy4it/blog/648337


http://lihuaxi.xjx100.cn/news/243535.html

相关文章

LINQ之路19:LINQ to XML之X-DOM更新、和Value属性交互

本篇包含两部分内容:X-DOM更新一节中我们会详细讨论LINQ to XML的更新方式,包括Value的更新、子节点和属性的更新、通过Parent节点实现更新; 和Value属性交互一节会详细讨论XElement和XAttribute的Value属性。如果一个元素只有单个XText子节点…

【Python基础】11、文本处理与IO深入理解

1、有一个文件,单词之间使用空格、分号、逗号、或者句号分隔,请提取全部单词。解决方案:使用\w匹配并提取单词,但是存在误判使用str.split分隔字符字符串,但是需要多次分隔使用re.split分隔字符串In [4]: help(re.spli…

python语言中如何使用注释

每一种计算机语言都有自己的注释方式,我们知道注释的作用是解释这些代码,方便程序员以后的检查和修改。而且注释的一部分在运行程序的过程中不起作用,也不会显示出来。下面我们将为大家介绍,在python语言中如何使用注释? 在pytho…

Servlet,过滤器,监听器,拦截器的区别

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又…

TO BUY

// book 人月神话 // hardware 乐视、凯酷一生黑 HHKB 白无刻 Filco 奶酪绿 G600 // tyon // Book 重构 改善既有代码的设计 java与模式 人月神话(40周年中文纪念版) MTG-G1000D-1A2 CASIO GST-S110BD-1B转载于:https://www.cnblogs.com/jinglecode/p/6…

JAVA-基础(Class对象及反射)

JAVA-基础(Class对象及反射) 1.(1)什么是class对象? 首先,java有两种对象,第一种是实例对象,第二种是Class对象,每一个类运行的类型信息就是用Class对象表示的&#xff0…

女生参加UI设计培训班有没有前途

在这个用户至上的时代,企业对于用户体验的关注度越来越高,很多职业都随之重视起来,尤其是UI设计岗位,很多女性都想学习UI设计,那么女生参加UI设计培训班有没有前途呢?我们来看看下面的详细介绍。 UI设计工作方向&…

day20 文件上传下载

2019独角兽企业重金招聘Python工程师标准>>> 文件上传基础及api解析: 文件上传最终版: 文件下载: 转载于:https://my.oschina.net/u/2356966/blog/648774