安卓录制音频:使用MediaRecord实现

这一段时间,由于项目需要,一直在搞使用音频录制。看了网上很多大牛的代码,各种删删减减,百度来百度去,终于大体把流程搞通了,用时5天。

注意:本次代码实现:通过麦克风获取说话人语音->存储语音->播放刚录制的语音->退出。

一、MediaRecord简介

MediaRecord可用于视频与音频的捕捉,由于项目采用的是对于说话人语音采集,所以选择MediaRecord实现。

巨人的肩膀参见:http://www.2cto.com/kf/201503/382894.html

二、结构简介

主要模块分为开始录制、结束录制、播放音频、退出。

1、开始录制

首先实例化一个MediaRecord对象,对其中开始设置。我在这里遇到的问题是时音频文件的存储位置。代码中getCacheDir得到的是内部缓存目录,这个目录可以通过file exploer看到,具体在data/data/app名称/cache。file exploer在windows->show view->other中找到。先打开它,在启动模拟器,刚开始启动时可以发现窗口中出现文件列表。

private void StartAudio(){//开始录制	     
		 recorder = new MediaRecorder();  
         recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音  
         recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //内容输出格式  
         recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
    
         //输出到缓存目录,此处可以添加上传录音的功能,也可以存到其他位置   
         audioFile = new File(getCacheDir(), "recoder"+ "_" + System.currentTimeMillis() + ".3gp");  
         recorder.setOutputFile(audioFile.getAbsolutePath());  
         try {  
             recorder.prepare();  
         } catch (IOException e) {  
             e.printStackTrace();  
         }  
         recorder.start();  
         record=true;  
         Log.i(tag,"开始录制!");  
         StartButton.setEnabled(false);
 		 StopButton.setEnabled(true);	
 		 PlayButton.setEnabled(false);
	}
2、结束录制

一开始运行时stop函数出现各种问题,后来总结可能是start函数根本没有运行。可惜我也是刚接触它,并不熟悉过程。之后查了很多文章,可以用Log.i进行输出,大致相当于C++中的printf函数。所以一定是要在start之后才能stop。

private void StopAudio(){	//结束录制
		recorder.stop();		
		//recorder.reset();   //14:19添加修改
		recorder.release();
		Log.i(tag,"停止录制!");  
		record=false;

		//更新状态
		//PlayButton.setEnabled(true);
		StartButton.setEnabled(true);
		StopButton.setEnabled(false);		
		PlayButton.setEnabled(true);
	}

3、播放音频

上面两部完成之后,实现起来就简单的多。可以在file explorer中查看到如下音频文件:安卓录制音频:使用MediaRecord实现_第1张图片

这样我们就可以播放刚刚录得文件了。代码比较精简,所以只实现了播放刚刚录制的文件。

private void PlayAudio(){
		player = new MediaPlayer();  
	        try {  
	        	player.setDataSource(audioFile.getAbsolutePath());  
	        	player.prepare();  
	        	player.start();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  	
	     StartButton.setEnabled(true);
		 StopButton.setEnabled(false);	
		 PlayButton.setEnabled(false);
	}
三、注意

1、在录音时需要获取对麦克风录音的权限

2、对于音频的存储位置 可以是手机上缓存或者SD卡缓存。其中SD卡上的缓存可以之后读取 下面几段代码是在SD卡上存储的。 

开始录制之前:
//写入SD卡
File fpath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");
         fpath.mkdirs();//创建文件夹
         try {
 			//创建临时文件
 			audioFile = File.createTempFile("recording", ".3gp", fpath);
 			} catch (IOException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 	}

结束录制之后:

			在SD卡上读取
			//然后我们可以将我们的录制文件存储到MediaStore中
			ContentValues values = new ContentValues();
			//values.put(MediaStore.Audio.Media.TITLE, "this is my first record-audio");
			values.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis());
			values.put(MediaStore.Audio.Media.DATA, audioFile.getAbsolutePath());
			//数据提供给第三方使用 添加入数据
			fileUri = this.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
			
			//录制结束后,我们实例化一个MediaPlayer对象,然后准备播放
			player = new MediaPlayer();
			player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
				
			@Override
			public void onCompletion(MediaPlayer arg0) {
			//更新状态
			//stateView.setText("准备录制");
			PlayButton.setEnabled(true);
			StartButton.setEnabled(true);
			StopButton.setEnabled(false);
			}
			});

			//准备播放
			try {
			player.setDataSource(audioFile.getAbsolutePath());
			player.prepare();
			} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			}

播放时代码:

//注意,我们在录音结束的时候,已经实例化了MediaPlayer,做好了播放的准备
player.start();    
//更新状态
stateView.setText("正在播放");
StartButton.setEnabled(false);
StopButton.setEnabled(false);
PlayButton.setEnabled(false);
//在播放结束的时候也要更新状态
            
//完成录制,返回录制的音频的Uri
Intent intent = new Intent();
intent.setData(fileUri);
this.setResult(RESULT_OK, intent);
this.finish();   



总结这个过程与原理,看起来并不难。但实际过程中,各种bug百出,自己最大的收获就是基本会使用logcat窗口,找到错误的位置。由于我没系统学过理论知识,之后只能在网上搜索前辈们的解决方法,逐一尝试。所以我就是在bug中成长起来的啊!

你可能感兴趣的:(安卓录制音频:使用MediaRecord实现)