Android录音MediaRecorder/AudioRecorder相关总结

这学期,笔者在制作一款Android音乐应用中需要用到录音功能,将MediaRecorder与AudioRecorder总结如下,如有纰误,望包涵并纠正。

一、MediaRecorder
使用MediaRecorder进行声音录制简单方便,不需要理会中间录制过程。结束录制后可以直接得到音频文件进行播放。
由于MediaRecorder较为简单,就不详细介绍,各位看官可自行搜索并试验。
可参考如下博客:
Android MediaRecorder录制音频:http://aina-hk55hk.iteye.com/blog/706793
Andriod MediaRecorder小结:http://www.cnblogs.com/shaobin0604/archive/2011/12/27/2303217.html
Android MediaRecorder框架介绍:http://forest606.blog.163.com/blog/static/13445008920102834914/
二、AudioRecorder

在声音录制过程中,有可能我们需要得到采集的声音数据并进行处理,比如降噪,合成等。MediaRecorder明显不能符合要求。而AudioRecorder恰能满足这种要求。过程为一段一段进行录制然后得到数据分别进行处理。

AudioRecorder可以有2种处理方式:

1. 设置AudioRecorder的UpdateListener和NotificationPeriod

audioRecorder.setRecordPositionUpdateListener(updateListener);  
audioRecorder.setPositionNotificationPeriod(framePeriod);  
然后在UpdateListener中进行处理。
2.另外开启一线程得到录制数据然后进行处理
第一种方式简单明了,是在主线程中处理,可以很方便的进行其他操作,如更新UI。但实际使用过程中发现,即使没有进行其他操作也会造成程序崩溃,所以不推荐使用。
第二种方式较为麻烦,特别是需要在子线程中更新UI。但是效果很好。

2种方式示例代码如下:
1. UpdateListener

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener()  
    {  
    	private int x = 0;
        public void onPeriodicNotification(AudioRecord recorder)  
        {          	
            audioRecorder.read(buffer, 0, buffer.length); // Fill buffer  
            try  
            {  
                //randomAccessWriter.write(buffer); // Write buffer to file  
                //payloadSize += buffer.length;  
                if (bSamples == 16)  
                {  
                    for (int i=0; i<buffer.length/2; i++)  
                    { // 16bit sample size  
                        short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);  
                        if (curSample > cAmplitude)  
                        { // Check amplitude  
                            cAmplitude = curSample;  
                        }  
                    }  
                }  
                else     
                { // 8bit sample size  
                    for (int i=0; i<buffer.length; ++i)  
                    {  
                        if (buffer[i] > cAmplitude)  
                        { // Check amplitude  
                            cAmplitude = buffer[i];  
                        }  
                    }  
                }  
            }  
            catch (Exception e)  
            {  
                Log.e(ExtAudioRecorder.class.getName(), "Error occured in updateListener, recording is aborted");  
                //stop();  
            }  
            if (x%4 == 0)
            {
            	mDrawingView.getEditingLayer().addSquare(x/4, 19 - (int)((cAmplitude/65535.0f)*19));
            	mDrawingView.invalidate();
            }
            ++x;
        }  
2. 子线程中处理:

class AudioRecordThread implements Runnable 
    { 
        public void run() 
        { 
        	while (isRecording) 
        	{ 
        		audioRecorder.read(buffer, 0, buffer.length); 
        		cAmplitude = 0;
	    		if (bSamples == 16)  
	            {  
	                for (int i=0; i<buffer.length/2; i++)  
	                { 
                        short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);  
                        if (curSample > cAmplitude)  
                        { 
                            cAmplitude = curSample;  
                        }  
                    }  
                }  
                else     
                { 
                    for (int i=0; i<buffer.length; ++i)  
                    {  
                        if (buffer[i] > cAmplitude)  
                        { 
                            cAmplitude = buffer[i];  
                        }  
                    }  
                }  

                Message message = Message.obtain();
                message.obj = (Object)(new Integer(19 - (int)((cAmplitude/65535.0f)*19)));
                messageHandler.sendMessage(message);
        	}  
        } 
    } 

以上文章仅供参考,如有纰漏烦请指正,交流请邮件: fuzhiyang0123@yahoo.com.cn

您想了解如何使用AndroidAudioRecorder录制蓝牙麦克风的音频吗?如果是的话,以下是一些基本的步骤: 1. 获取蓝牙设备的音频源 使用`MediaRecorder.AudioSource`中的`VOICE_RECOGNITION`参数获取蓝牙设备的音频源。 2. 配置和准备录音器 创建`AudioRecorder`对象,设置音频源、采样率、声道数、编码格式等参数,并调用`prepare()`方法准备录音器。 3. 启动录音 调用`start()`方法开始录音录音期间,将蓝牙设备连接到Android设备,并将其设置为音频输入源。录音完成后,调用`stop()`方法停止录音,并释放资源。 下面是一些示例代码,可以帮助您开始录制蓝牙麦克风的音频: ``` private AudioRecorder audioRecorder; private void startRecording() { audioRecorder = new AudioRecorder(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); audioRecorder.setAudioSamplingRate(44100); audioRecorder.setAudioChannels(2); audioRecorder.setOutputFile(getFilePath()); // 设置音频文件保存路径 try { audioRecorder.prepare(); audioRecorder.start(); } catch (Exception e) { e.printStackTrace(); } } private void stopRecording() { if (audioRecorder != null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder = null; } } ``` 请注意,这只是一个基本示例。您可能需要根据自己的需求进行更改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值