数字音频
数字音频的操作需要3个步骤:采样,量化,编码。
- 采样:这个是指音频的。首先要对模拟信号进行采样,所谓采样就是在时间轴上对信号进行数字化。采样率一般是44.1kHz,而所谓的44.1kHz就是代表1秒会采样44100次
- 量化:是指在幅度轴上对信号进行数字化,比如用16比特的二进制信号来表示声音的一个采样,而16比特(一个short)所表示的范围是[-32768,32767],共有65536个可能取值,因此最终模拟的音频信号在幅度上也分为了65536层。
- 编码:既然每一个量化都是一个采样,那么这么多的采样该如何进行存储呢?这就涉及将要讲解的第三个概念:编码。所谓编码,就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储,等等。这里面涉及了很多种格式,通常所说的音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation, PCM)数据。
音频编码
压缩编码的基本指标之一就是压缩比,压缩比通常小于1(否则就没有必要去做压缩,因为压缩就是要减小数据容量)。
压缩算法包括有损压缩
和无损压缩
。
- 无损压缩是指解压后的数据可以完全复原。在常用的压缩格式中,用得较多的是有损压缩。
- 有损压缩是指解压后的数据不能完全复原,会丢失一部分信息,压缩比越小,丢失的信息就越多,信号还原后的失真就会越大。根据不同的应用场景(包括存储设备、传输网络环境、播放设备等),可以选用不同的压缩编码算法,如PCM、WAV、AAC、MP3、Ogg等。
压缩编码的原理实际上是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。
几种常用的音频压缩编码格式
- WAV编码:WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。
特点:音质非常好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。 - MP3编码:MP3具有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。
特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。 - AAC编码:AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术。
特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。
适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码。
PCM数据
描述一段PCM数据一般需要以下几个概念
- 量化格式(sampleFormat)
- 采样率(sampleRate)
- 声道数(channel)。
以CD的音质为例:量化格式(有的地方描述为位深度)为16比特(2字节),采样率为44100,声道数为2,这些信息就描述了CD的音质。而对于声音格式,还有一个概念用来描述它的大小,称为数据比特率,即1秒时间内的比特数目,它用于衡量音频数据单位时间内的容量大小。而对于CD音质的数据,比特率为多少呢?计算如下:
44100 * 16 * 2 = 1378.125kbps
那么在1分钟里,这类CD音质的数据需要占据多大的存储空间呢?计算如下:
1378.125 * 60 / 8 / 1024 = 10.09MB
Android平台的声音渲染 (播放)
- Java SDK: MediaPlayer、SoundPool和AudioTrack。这三个API的使用场景各不相同,简单来说具体如下。
- MediaPlayer:适合在后台长时间播放本地音乐文件或者在线的流式媒体文件,它的封装层次比较高,使用方式比较简单。
- SoundPool:适合播放比较短的音频片段,比如游戏声音、按键声音、铃声片段等,它可以同时播放多个音频。
- AudioTrack:适合低延迟的播放,是更加底层的API,提供了非常强大的控制能力,适合流媒体的播放等场景,由于其属于底层API,所以需要结合解码器来使用。
- NDK : OpenSL ES,可以提供非常强大的音效处理、低延时播放等功能,比如在Android手机上可实现实时耳返的功能。
Android平台录制声音
- AudioRecord
网友评论