MediaRecorder中遇到的坑

对于刚刚接触MediaRecorder的小伙伴,其实有很多很苦恼的问题,例如下面的代码块,你就可能出错,而且这种错误不容易意识到:

MediaRecorder mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);      
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
try {
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
} catch (Exception e) {
    e.printStackTrace();
 }

错误来源:定义MediaRecorder的AudioSource、OutputFormat以及AudioEncorder三个属性的顺序和以上代码顺序不一样,这时就会报错。

// 开始录音
mMediaRecorder.setOutputFile(file.getAbsolutePath());
try {
      mMediaRecorder.prepare();
      mMediaRecorder.start();
} catch (IOException e) {
      e.printStackTrace();
}
...
//停止录音,释放资源
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();   

错误来源:当调用release()方法时,JNI中的native方法已经将资源释放,同时mMediaRecorder已经指向了空指针,但是Java代码中,它仍然不为空(通过mMediaRecorder==null判断就知道),然后你会发现每次代码执行到prepare()方法时,程序就会崩溃,这是logcat还不会报错,你会很郁闷,本人也是多番实验以及翻阅资料以及度娘才知道的问题所在,这时候你需要重新设置MediaRecorder的三个属性,也就是第一个代码块的代码要重新执行一遍。结论就是:每次开始录音都需要初始化所有资源,每次录音完毕,都释放所有资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值