android手机的Mic对声音的感知

本文详细介绍Android平台上的录音技术,对比AudioRecord与MediaRecorder两种录音方式的特点及应用场景。AudioRecord适用于实时分析音频数据,而MediaRecorder则更侧重于直接保存编码后的音频文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  android提供可以实现录音功能的有AudioRecord和MediaRecorder,其中AudioRecord是读取Mic的音频流,可以边录音边分析流的数据;而MediaRecorder则能够直接把Mic的数据存到文件,并且能够进行编码(如AMR,MP3等)。

        首先,要将你的应用加入权限(无论你是使用AudioRecord还是MediaRecorder):

                 <uses-permission android:name="android.permission.RECORD_AUDIO" />

        然后,分开介绍两者的用法。

        《!--AudioRecord--》

        1、新建录音采样类,实现接口:

             public class MicSensor implements AudioRecord.OnRecordPositionUpdateListener

        2、关于AudioRecord的初始化:

             public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

             audioSource:              录音源(例如:MediaRecorder.AudioSource.MIC    指定Mic为录音源)

             sampleRateInHz:        默认的采样频率,单位为Hz。(常用的如44100Hz、22050Hz、16000Hz、11025Hz、8000Hz,有人说44100Hz是目前保证在所有厂商的android手机上都能使用的采样频率,但是个人在三星i9000上使用却不然,经测试8000Hz似乎更为靠谱)  

            channelConfig:           描述音频通道设置。(在此我使用了AudioFormat.CHANNEL_CONFIGURATION_MONO)

            audioFormat:              音频数据支持格式。(这个好像跟声道有关,16bit的脉码调制录音应该是所谓的双声道,而8bit脉码调制录音是单声道。AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT

           bufferSizeInBytes:        在录制过程中,音频数据写入缓冲区的总数(字节)。 从缓冲区读取的新音频数据总会小于此值。 getMinBufferSize(int, int, int)返回AudioRecord 实例创建成功后的最小缓冲区。 设置的值比getMinBufferSize()还小则会导致初始化失败。

       3、初始化成功后则可启动录音    audioRecord.startRecording()

       4、编写线程类将录音数据读入缓冲区,进行分析

             short[] buffer = new short[bufferSize];              //short类型对应16bit音频数据格式,byte类型对应于8bit
             audioRecord.read(buffer, 0, bufferSize);            //返回值是个int类型的数据长度值

      5、在此需要对buffer中的数据进行一些说明:

           这样读取的数据是在时域下的数据,直接用于计算没有任何实际意义。需要将时域下的数据转化为频域下的数据,才能诉诸于计算。

           频域(frequency domain)是指在对函数或信号进行分析时,分析其和频率有关部份,而不是和时间有关的部份。

           函数或信号可以透过一对数学的运算子在时域及频域之间转换。例如傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。

           信号在时域下的图形可以显示信号如何随着时间变化,而信号在频域下的图形(一般称为频谱)可以显示信号分布在哪些频率及其比例。频域的表示法除了有各个频率下的大小外,也会有各个频率的相位,利用大小及相位的资讯可以将各频率的弦波给予不同的大小及相位,相加以后可以还原成原始的信号。

           经傅立叶变化后得到的复数数组是个二维数组,实部和虚部的平方和取对数后乘以10就大致等于我们通常表示音量的分贝了。

       《!--MediaRecorder--》

         相对于AudioRecord,MediaRecorder提供了更为简单的api。

[java]  view plain copy
  1.               mediaRecorder = new MediaRecorder();  
  2. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  3. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  4. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  5. mediaRecorder.setOutputFile("/dev/null");    

         设置好mediaRecorder的各个属性,然后通过线程调用方法  mediaRecorder.getMaxAmplitude();

            得到的是瞬时的最大振幅,直接取对数然后乘以10就可以表征分贝了。

            最后需要说明一下,android手机厂商定制的硬件不尽相同,所以mic获取的值也只能“表征”,而不能拿过来当真正的依据。它们虽是智能手机,但也还是手机,机器人不是人!呵呵。。。

            对了,每个手机mic在声信号和电信号进行转换时都有做过电容保护,为了其不因外界环境的过于嘈杂而易受到损坏。所以超声波和次声波,我们人不容易接受的声音,手机也不会入耳的。

### Android 声学成像技术实现方法 #### 1. 基础概念和技术背景 声学成像是利用声音信号来创建环境图像的技术。在Android设备上实施此技术涉及多个方面,包括但不限于语音处理、音频捕捉以及数据分析等环节。对于移动平台而言,这通常意味着要高效地运用有限资源完成复杂的计算任务。 #### 2. 音频数据获取 为了构建有效的声学成像系统,在Android环境中首先需要解决的就是高质量的声音输入问题。可以借助内置麦克风阵列或多台手机协同工作的方式收集多通道音频样本[^3]。通过这种方式可以获得更丰富的空间信息用于后续处理阶段。 #### 3. 数据预处理与特征提取 获得原始音频流之后,下一步是对这些数据进行必要的清理和转换操作以便于进一步分析。常见的做法是应用傅里叶变换或其他频率域分析工具将时间序列转化为频谱图表示形式;此外还可以考虑加入噪声抑制模块提高信噪比(SNR)[^1]。 #### 4. 成像算法设计 核心部分在于选择合适的数学模型来进行目标定位及重建。基于波束形成(Beamforming)原理的方法因其简单易行而被广泛采用——它能够根据不同位置接收到相同事件的时间差(TDOA)推断出声源方位角。另一种较为先进的方案则是压缩感知理论指导下的稀疏重构法,该方法能够在减少测量次数的同时保证较高的精度[^2]。 #### 5. 结果可视化呈现 最后一步就是把经过上述各步得到的空间分布映射到二维平面上供用户直观查看。这里可能涉及到图形渲染引擎的选择(如OpenGL ES),同时也需注意优化界面响应速度以确保良好用户体验。 ```java // 示例代码片段:初始化AudioRecord对象准备录音 int sampleRateInHz = 44100; int channelConfig = AudioFormat.CHANNEL_IN_MONO; int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值