在MediaRecord中我们会用到很多方法,下面我简单的总结一下:
方法名称 | 描述 |
public void setAudioEncoder (int audio_encoder) | 设置刻录的音频编码,其值可以通过MediaRecoder内部类的MediaRecorder.AudioEncoder的几个常量:AAC、AMR_NB、AMR_WB、DEFAULT |
public void setAudioEncodingBitRate (int bitRate) | 设置音频编码比特率 |
public void setAudioSource (int audio_source) | 设置音频的来源,其值可以通过MediaRecoder内部类的MediaRecorder.AudioSource的几个常量来设置,通常设置的值MIC:来源于麦克风
|
public void setCamera (Camera c) | 设置摄像头用于来刻录 |
public void setOutputFormat (int output_format) | 设置输出文件的格式,其值可以通过MediaRecoder内部类MediaRecorder.OutputFormat的一些常量字段来设置。比如一些3gp(THREE_GPP)、mp4(MPEG4)等等 |
setOutputFile(String path) | 设置输出文件的路径 |
setVideoEncoder(int video_encoder) | 设置视频的编码格式。其值可以通过MediaRecoder内部类的MediaRecorder.VideoEncoder的几个常量:H263、H264、MPEG_4_SP |
setVideoSource(int video_source) | 设置刻录视频来源。其值可以通过MediaRecorder的内部类MediaRecorder.VideoSource来设置。比如可以设置刻录视频来源为摄像头:CAMERA |
setVideoEncodingBitRate(int bitRate) | 设置编码的比特率 |
setVideoSize(int width, int height) | 设置视频的大尺寸 |
public void start() | 开始刻录 |
public void prepare() | 预期做准备 |
public void stop() | 停止 |
public void release() | 释放该对象资源 |
在这里创建目录出现了一点问题,在此记录下来,以便使用:
mkdir()
只能在已经存在的目录中创建文件夹。
mkdirs()
可以在不存在的目录中创建文件夹(可以创建多级目录)。
public boolean mkdirs()
创建一个目录,它的路径名由当前File对象指定,包括任一必须的父路径。
返回值:
如果该目录(或多级目录)能被创建则为true,否则为false;
public boolean mkdir()
创建一个目录,它的路径名由当前File对象指定。
返回值:
如果该目录能被创建则为true,否则为false;
代码实现:
private Button btn_control;
private Boolean isStart = false;//默认初始化为未开始。
private MediaRecorder mediaRecorder = null;//默认初始化录音为空。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_control = (Button)findViewById(R.id.btn_start);
btn_control.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if (!isStart){
startRecord();
btn_control.setText("停止录制");
isStart = true;
}else{
stopRecord();
btn_control.setText("开始录制");
isStart = false;
}
}
});
}
//开始录制
private void startRecord(){
if (mediaRecorder == null){//判断为空,开始录制
File dir = new File(Environment.getExternalStorageDirectory(),"sound");
if (!dir.exists()){//如果不存在,进行创建
dir.mkdirs();
}
File soundFile = new File(dir,System.currentTimeMillis()+ ".amr");
if (!soundFile.exists()){
try {
soundFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
}
mediaRecorder = new MediaRecorder();//初始实例化。
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//音频输入源
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);//设置输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//设置编码格式
mediaRecorder.setOutputFile(soundFile.getAbsolutePath());//设置输出文件的路径
try {
mediaRecorder.prepare();//准备录制
mediaRecorder.start();//开始录制
}catch (IOException e){
e.printStackTrace();
}
}
}
//停止录制
private void stopRecord(){
if (mediaRecorder != null){//判断非空,停止录制
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
}
这里我们涉及到了危险权限,因此一定要注意权限问题,一般情况下我们只需要添加这两个权限声明就可以解决了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
但是博主在添加这两个权限后还是报错,这是怎么回事呢?安卓6.0以上系统需要动态获取权限,具体解决办法如下:
if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_CONTACT = 101;
String[] permissions = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
//验证是否许可权限
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
//申请权限
this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
return;
}
}
}
涉及摄像头等问题建议在真机上进行测试。