我目前正在使用AudioReRordJava对象从麦克风接收音频。有时我拉数据的速度不够快(例如,当应用程序发生切换时)。有什么方法让我知道音频流被音频缓冲区下溢中断了吗?
最佳答案
您可以尝试使用MediaRecorder类而不是audiorecord,它提供了一些额外的方法,包括注册错误回调方法的能力。不过,我不确定所有版本的android是否都会在运行不足的情况下调用它。如果你在这里得到回调,那可能是“更干净”的解决方案。
另一种解决方案是,您可以测量轮询音频时所用的时间,并确定是否发生了欠载。基本上,您可以在调用read()
之前将时间存储在一个局部变量中,然后再次调用:
long startTime = System.nanoTime();
int bytesRead = read(...);
long elapsedTime = System.nanoTime() - startTime;
您可能希望使用
System.nanoTime()
而不是System.currentTimeMillis()
,尽管纳秒时间不是很精确,但它将比系统的毫秒精度更精确。然后,使用采样率和缓冲区大小,可以计算此调用所需的毫秒数:long maxMilliseconds = (bufferSize / getSampleRate()) * 1000;
如果经过的时间大于此值,则可能发生音频丢失,您可以触发错误处理程序。
还要注意,
AudioRecord.read()
方法返回从设备实际读取的字节数。您应该将其与预期读取的字节数进行比较,因为这也是检测缓冲区不足的一种非常简单的方法。