12.2.3 Android音视频的录制
音视频的录制需要使用android.media.MediaRecorder,其控制方式与音视频播放有着异曲同工之妙:
MediaRecorder recorder=new MediaRecorder();
//初始化需要录制的文件格式和路径
recorder.setAudioSource(AudioSource.MIC);
recorder.setOutputFormat(OutputFormat.THREE_GPP);
recorder.setAudioEncoder(AudioEncoder.AMR_NB);
recorder.setOutputFile(aRecoderFile);
//开始录制
recorder. prepare();
recorder. start();
MediaRecorder中各个函数被调用时,同样也伴随着状态的不断变化(如图12-4所示)。开发者需要在合适的状态下,正确地调用函数,才能保证整个录制过程正常执行。
图 12-4 MediaRecoder的状态转移图
需要特别注意的是,在实际录制音视频的时候,可能会有各种异常状况发生,比如SD卡无法写入、录音设备被占用等,妥善处理这些错误,是开发时必须要做到的。Android原生的录音应用,为如何处理这些异常状况,提供了一个范例:
MediaRecorder recorder=new MediaRecorder();
//初始化需要录制的文件格式和路径
…
//准备录制,此时由于SD卡处于异常状况,导致一些位置的读写错误
try{
recorder.prepare();
}catch(IOException exception){
//设置为未知的内部错误
setError(INTERNAL_ERROR);
//将录音对象重置
recorder.reset();
recorder.release();
recorder=null;
return;
}
//开始录制,由于各种异常状况,录制很有可能无法开始
try{
mRecorder.start();
}catch(RuntimeException exception){
//如果此时正处于通话状态,那就是录音设备被占用
//如果不是,则很有可能是SD卡状态异常
AudioManager audioMgr=(AudioManager)
context.getSystemService(Context.AUDIO_SERVICE);
boolean isInCall=
((audioMgr.getMode()==AudioManager.MODE_IN_CALL)||
(audioMgr.getMode()==AudioManager.MODE_IN_COMMUNICATION));
if(isInCall){
setError(IN_CALL_RECORD_ERROR);
}else{
setError(INTERNAL_ERROR);
}
//将录音对象重置
recorder.reset();
recorder.release();
recorder=null;
return;
}