我目前正在使用AudioRecord java对象从麦克风接收音频。有时我不会足够快地提取数据(例如,当发生应用程序切换时)。是否有任何方法可以让我知道音频流被音频缓冲器下溢而中断?
答案 0 :(得分:6)
您可以尝试使用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()
方法返回实际从设备读取的字节数。您应该将此值与您希望读取的字节数进行比较,因为这也是检测缓冲区欠载的一种非常简单的方法。
答案 1 :(得分:0)
从你的问题来看,我认为你的意思是溢出,而不是不足。我有同样的问题,但是有溢出。对于欠载,read方法只是阻塞,直到有足够的数据准备就绪。