最近在项目开发中用到了android的录音功能,在实现中也查看了相应的api,有点小感悟!
代码下载:http://download.csdn.net/detail/ckq5254/9579465
一、对录音过程的分析
以上是google的api提供的录音原理图,总的来说包含了录音该有的开始录音,录音准备,结束录音等过程。
其中应该特别注意几个点:
(1)setoutputFormat()方法必须在setAudioEncoder()等方法之前,这里从上面的图中先后顺序可以看出来。
(2)录音开始前应该先prepare()再start()。
(3)在录音结束后应该release执行(),释放资源。
二、过程分析
主要分为两部分,一部分是录音,一部分是播放录音。
一、录音
(1)首先实例化MediaRecorder对象
(2)设置录音参数
//设置录音输入为麦克风
mRecord.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置音频格式
mRecord.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置音频输出文件
mRecord.setOutputFile(fileName);
//设置音频编码
mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
(3)开始录音
mRecord.prepare();
mRecord.start();
(4)停止录音
mRecord.stop();
//释放资源
mRecord.release();
mRecord = null;
二、播放
(1) 实例化MediaPlayer对象
(2)开始播放
//设置播放文件路径
mPlayer.setDataSource(fileName);
//准备资源
mPlayer.prepare();
//开始播放
mPlayer.start();
(3)停止播放
mPlayer.stop();
mPlayer.release();
(1)布局activity_main.xml
主体布局很简单,就是四个按钮
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.recorddemo.MainActivity"> <Button android:id="@+id/start_record" android:layout_width="100dp" android:text="开始录音" android:layout_height="50dp" android:layout_gravity="center_horizontal" /> <Button android:id="@+id/stop_record" android:layout_width="100dp" android:layout_height="50dp" android:text="停止录音" android:layout_gravity="center_horizontal" /> <Button android:text="播放录音" android:id="@+id/play_record" android:layout_width="100dp" android:layout_height="50dp" android:layout_gravity="center_horizontal" /> <Button android:id="@+id/stop_play" android:layout_width="100dp" android:layout_height="50dp" android:text="停止播放" android:layout_gravity="center_horizontal" /> </LinearLayout>(2)核心代码
package com.example.administrator.recorddemo;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_start,btn_stop,btn_play,btn_stop_play;
private MediaPlayer mPlayer;//录音播放
private MediaRecorder mRecord;//录音类
private String fileName = null;//录音文件名
private String root = null;//录音文件根目录
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
root = Environment.getExternalStorageDirectory().getAbsolutePath();获取sd卡目录
fileName= root+"/record.3gp";
initView();//初始化view
initEvents();//初始化点击事件
}
private void initEvents() {
btn_stop_play.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_play.setOnClickListener(this);
btn_start.setOnClickListener(this);
}
private void initView() {
btn_start = (Button)findViewById(R.id.start_record);
btn_stop = (Button)findViewById(R.id.stop_record);
btn_play = (Button)findViewById(R.id.play_record);
btn_stop_play = (Button)findViewById(R.id.stop_play);
}
@Override
public void onClick(View view) {
switch (view.getId()){
//开始录音
case R.id.start_record:
mRecord = new MediaRecorder();//实例化MediaRecorder对象
btn_start.setText("正在录音...");
mRecord.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频输入为麦克风
mRecord.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频
mRecord.setOutputFile(fileName);//设置保存的音频文件,这里的filename为路径+文件名
mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码
try {
mRecord.prepare();
} catch (IOException e) {
System.out.println("Record fail!!!!!!!!!");
e.printStackTrace();
}
mRecord.start();
System.out.println("录音成功!!!");
break;
//停止录音
case R.id.stop_record:
btn_start.setText("开始录音");
mRecord.stop();
mRecord.release();//释放资源
mRecord = null;
break;
//播放录音
case R.id.play_record:
mPlayer = new MediaPlayer();//实例化MediaPlayer
try {
mPlayer.setDataSource(fileName);//设置播放文件来源
mPlayer.prepare();//准备播放
mPlayer.start();
} catch (IOException e) {
e.printStackTrace();
System.out.println("Play Record fail!!!!");
}
break;
//停止播放
case R.id.stop_play:
mPlayer.stop();
mPlayer.release();
break;
}
}
}