我想捕获 5 秒的音频并使用 android.media.MediaRecorder
保存它。一种方法是调用 start()
并计划使用 android.os.Handler
调用 stop()
,但我不确定这是否非常精确。
MediaRecorder
有 setMaxDuration
看起来有希望的方法。一旦定时器到了,它就会向 android.media.MediaRecorder.OnInfoListener
发送一条消息,但文档说:
Stopping happens asynchronously, there is no guarantee that the recorder will have stopped by the time the listener is notified.
我相信完成后我需要在 MediaRecorder
上调用 release()
,因此我需要知道何时可以安全地执行此操作。
所以:
- state transition diagram 中未提及最长持续时间。是否需要调用
stop()
? - 我是否正确假设录音机将在最大持续时间结束时保存音频并刷新文件?文档中没有提到刷新/完成文件。
- 如果我不重用
MediaRecorder
对象,是否真的有必要调用release()
? - 我是否应该认为由于异步性,在
OnInfoListener
中调用release()
是不安全的? - 如果是这样,我该怎么做?设置另一个计时器?
最佳答案
正如您所提到的,setMaxDuration
方法看起来很有前途,尽管停止捕获是异步发生的这一事实留下了对实际性能的一些猜测。可能值得测试此方法,看看所需的捕获时间与实际捕获时间有多少差异。附带说明一下,使用此方法时不必调用 stop()
。另外,由于 setMaxDuration
本质上只是对 stop()
的预定调用,因此我认为可以安全地假设它也将处理刷新/终结。
如果您发现此方法太不准确而无用,那么您可以使用简单的 CountDownTimer
来安排您的记录间隔。这个类很好,因为刻度是同步的,这意味着您的计时间隔将精确到几毫秒内;比尝试安排 Handler
准确得多。您可以尝试如下操作:
new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
mediaRecorder.stop();
mediaRecorder.release();
}
}
.start();
上面的示例安排了一个 5 秒的 CountDownTimer
和 1 秒的刻度。当 5 秒过去后,将分别调用 stop()
和 release()
。如果您想让它更加准确,您可以在 onTick()
方法内添加一个简单的计数器,然后将所有 MediaRecorder
调用放在那里。例如,如果您将 CountDownTimer
设置为 7 秒,仍然以 1 秒为周期,那么在第一个周期时,您将调用 start()
,假设您已经准备录音;然后,五个时钟周期后,您将调用 stop()
和 release()
。这将是相当准确的,因为根据 CountDownTimer
API:
the calls to
onTick(long)
are synchronized to this object
关于调用release()
,即使您不打算重用该对象,也建议调用此方法。根据 API 文档,未能释放 MediaRecorder
实例可能会导致资源/电池耗尽:
In addition to unnecessary resources (such as memory and instances of codecs) being held, failure to call this method immediately if a MediaRecorder object is no longer needed may also lead to continuous battery consumption for mobile devices, and recording failure for other applications if no multiple instances of the same codec are supported on a device.
关于android - 如何安全地使用 MediaRecorder 捕获特定时长的媒体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852946/