关于Audio你应该知道的一点知识

来源:互联网 发布:give up it give it up 编辑:程序博客网 时间:2024/06/16 11:40

在准备写这篇文章之前,一直在犹豫应该要怎么开始。因为涉及的知识点实在是很多而且又杂,最终还是决定从AudioRecord的参数入手,相信把AudioRecord的参数都搞懂了之后,对Android中audio的使用应该也能达到熟练掌握程度了吧。 首先来看一下AudioRecord如何使用

AudioRecord aRecorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize);

就从第一个参数audioSource开始

这个参数的意义是为录音设置录音源,具体取值以及所代表的意义如下:

DEFAULT     默认音频源MIC         录音来源为主麦克风VOICE_CALL  录音来源为语音播出的语音与对方说话的声音CAMCORDER   设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风

第二个参数叫做sampleRate

所谓sampleRate也就是我们经常说到的采样率. 由于声音其实是一种能量波,因此也有 频率振幅 的特征,频率 对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。常见的采样率有16KHz、32KHz、44.1KHz、48KHz。而我们常见的CD,采样率就是44.1kHz

注意: 频率与采样率的关系
采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,这意味着什么呢?假设我们有2段正弦波信号,分别为20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行 40KHz的采样,我们可以得到一个什么样的结果呢?结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是为什么有些音响发烧友指责CD有数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,于是有些朋友在捕捉CD音轨的时候使用48KHz的采样率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,请不要去尝试提高采样率

第三个参数channelConfig

这个参数很好理解不用多说,就是对录音声道的设置,常用的选项包含以下几种:

CHANNEL_IN_MONO      单声道  CHANNEL_IN_STEREO    立体声道

第四个参数audioFormat

这是一个比较重要的参数。这个参数会指定两种规格:编码制式和采样大小。常用的format有以下两种:

AudioFormat.ENCODING_PCM_16BITAudioFormat.ENCODING_PCM_8BIT

PCM代表的就是编码制式,16BIT/8BIT代表的就是采样大小

那这个PCM究竟是什么东东??

PCM—Pulse Code Modulation(脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理. 说白了脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程, 而这一过程是无损的,所以使用PCM转化来的音频的音质比较接近与原生态,也就是音质更高。用一张图片来表示就如下图所示:
这里写图片描述

8BIT/16BIT

ENCODING_PCM_8BIT: The audio sample is a 8 bit unsigned integer in the range [0, 255], with a 128 offset for zero. This is typically stored as a Java byte in a byte array or ByteBuffer. Since the Java byte is signed, be careful with math operations and conversions as the most significant bit is inverted.

8BIT使用一个无符号的8位Integer来保存取值范围是[0, 255]

ENCODING_PCM_16BIT: The audio sample is a 16 bit signed integer typically stored as a Java short in a short array, but when the short is stored in a ByteBuffer, it is native endian (as compared to the default Java big endian). The short has full range from [-32768, 32767], and is sometimes interpreted as fixed point Q.15 data.

16BIT使用的是一个16位的带符号Integer来存储

http://blog.csdn.net/zxm317122667/article/details/78746503
http://blog.csdn.net/nanaqx/article/details/46437843
http://blog.csdn.net/p2011211616/article/details/53432645

原创粉丝点击