gpt4 book ai didi

android - 如何安全地使用 MediaRecorder 来捕获特定持续时间的媒体?

转载 作者:行者123 更新时间:2023-11-29 20:48:13 25 4
gpt4 key购买 nike

我想捕捉 5 秒的音频并使用 android.media.MediaRecorder 保存它。一种方法是调用 start() 并安排 stop()android.os.Handler 一起调用,但我不确定是否会非常精确。

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()
  • 我是否应该假设由于异步而将 release() 作为 OnInfoListener 的一部分调用是不安全的?
  • 如果是这样,我应该怎么做?设置另一个计时器?

最佳答案

正如您所提到的,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com