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

时间:2015-04-24 16:39:14

标签: android mediarecorder

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

MediaRecordersetMaxDuration方法,看起来很有希望。一旦计时器启动,它将向android.media.MediaRecorder.OnInfoListener发送消息,但文档说:

  

停止异步发生,无法保证   听众被通知时,录音机将停止。

我相信在完成后我需要在release()上致电MediaRecorder,所以我需要知道什么时候这样做是安全的。

所以:

  • state transition diagram中未提及最长持续时间。是否有必要致电stop()
  • 我是否正确假设录音机将保存音频并在最长持续时间结束时刷新文件?文档中未提及刷新/完成文件。
  • 如果我没有重复使用release()对象,是否真的有必要调用MediaRecorder
  • 我是否应该假设release()作为OnInfoListener的一部分因为异步而被调用是不安全的?
  • 如果是的话,我应该怎么做?设置另一个计时器?

1 个答案:

答案 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对象也可能导致连续   移动设备的电池消耗和录制失败   其他应用程序,如果没有相同编解码器的多个实例   在设备上支持。