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.2.3 Android音视频的录制 - 图1

图 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;

}