android - 如何安全地使用 MediaRecorder 捕获特定时长的媒体?

标签 android mediarecorder

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

MediaRecordersetMaxDuration看起来有希望的方法。一旦定时器到了,它就会向 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/

相关文章:

android - PlayN - Android 上没有声音

android - 在 Android 中启动 MediaRecorder 时出现 Start failed -16 错误

Android MediaRecorder 启动失败-19

android - 根据单击的 ListView 项播放音频

java - Android 中 calendar.MINUTE 和 calendar.get(Calendar.MINUTE) 的区别

android - 通过蓝牙打印机打印时获取 java.io.IOException : read failed, 套接字可能已关闭或超时,请读取 ret: -1

Android - 如何在调用相机 Intent 时自动开始录制视频

android - MediaRecorder.stop() 卡在 Android 4.0 (ICS)

java - JNI : NoSuchFieldError

android - 在网站和移动应用程序上使用 Google 帐户进行单点登录