我想捕获5秒的音频并使用android.media.MediaRecorder
保存。一种方法是调用start()
并使用stop()
调度android.os.Handler
,但我不确定这是非常精确的。
MediaRecorder
有setMaxDuration
方法,看起来很有希望。一旦计时器启动,它将向android.media.MediaRecorder.OnInfoListener
发送消息,但文档说:
停止异步发生,无法保证 听众被通知时,录音机将停止。
我相信在完成后我需要在release()
上致电MediaRecorder
,所以我需要知道什么时候这样做是安全的。
所以:
stop()
?release()
对象,是否真的有必要调用MediaRecorder
?release()
作为OnInfoListener
的一部分因为异步而被调用是不安全的?答案 0 :(得分:2)
正如你所提到的,setMaxDuration
方法看起来很有希望,尽管停止捕获是异步发生的事实留下了一些关于实际性能的猜测。测试此方法并查看所需捕获时间与实际捕获时间的差异程度可能是值得的。作为旁注,使用此方法时不必调用stop()
。此外,由于setMaxDuration
基本上只是对stop()
的预定调用,我认为可以安全地假设它还将处理刷新/最终确定。
如果您发现此方法太不准确而无法使用,那么您可以使用简单的CountDownTimer
来安排录制间隔。这个类很好,因为tick是同步的,这意味着你的时间间隔将精确到几毫秒内;比试图安排Handler
更准确。您可以尝试以下内容:
new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
mediaRecorder.stop();
mediaRecorder.release();
}
}
.start();
以上示例使用1s刻度调度5s CountDownTimer
。经过5秒后,将分别调用stop()
和release()
。如果您想让它更加准确,您可以在onTick()
方法中添加一个简单的计数器,然后将所有MediaRecorder
个调用放在那里。例如,如果您将CountDownTimer
设置为7秒,仍然有1秒钟的刻度,那么在第一个刻度线上,您将调用start()
,假设您已准备好录音;然后,五个小时后你会打电话给stop()
和release()
。根据{{1}} API:
对
CountDownTimer
的调用将同步到此对象
关于调用onTick(long)
,建议即使您不打算重用该对象也要调用此方法。根据API文档,未能释放release()
实例可能会导致资源/电池耗尽:
除了不必要的资源(例如内存和实例) 正在举行,如果a,则无法立即调用此方法 不再需要MediaRecorder对象也可能导致连续 移动设备的电池消耗和录制失败 其他应用程序,如果没有相同编解码器的多个实例 在设备上支持。