AudioRecord API可以松开任何音频帧,如果它的数据没有被读取但是它是连续录制的吗?

时间:2016-08-11 15:23:23

标签: android audio latency audiorecord

这个问题对我来说非常重要,因为我希望从AudioRecord API接收的音频帧与绝对时间无关。所以,问题基本上就是说我已经打电话给AudioRecord.startRecording()。在我这样做之后,我启动一个线程(称之为 Thread1 ),开始使用AudioRecorderAudioRecord.read(...)实例读取音频帧。在我的应用程序运行时,让我们说 Thread1 停止500毫秒。当 Thread1 恢复时,我是否会丢失一些音频数据,或者 AudioRecord 维护一个缓冲区来处理这个问题(我有一个很大的推动)?

  1. 如果是,AudioRecord维护的缓冲区大小是多少?
  2. 是根据设备AudioRecord的帧大小还是某个绝对持续时间定义的?
  3. 另外,从我调用AudioRecord.startRecording()到实际开始记录数据的时间,我可以期待多长时间?
  4. 我知道我已经提出了很多问题,如果有人真的回答这些问题,我将非常感激。

1 个答案:

答案 0 :(得分:2)

AudioRecord用于在用户使用数据之前保留数据的唯一缓冲区是初始化期间创建的缓冲区。您可以通过bufferSizeInBytes设置其大小。如果用户暂时不读取PCM,数据将丢失并替换为新数据。因此,为了确保您不会丢失它 - 指定相当大的缓冲区大小。计算非常简单:

bufSz = samplingFreqHz * sampleSize * channelNum * bufCapacitySec;

E.g。如果要保持5秒的立体声16位PCM采样频率为44100Hz,则需要44100 * 2 * 2 * 5 = 882000字节。因此,只需确定读者线程休眠的时间长度,并为AudioRecord提供足够的缓冲区大小,以便在睡眠期间累积所有数据。

最重要的是

  

如果是,AudioRecord维护的缓冲区大小是多少?

您有责任将正确的大小传递给构造函数调用。

  

是根据AudioRecord的帧大小来定义的   设备或一些绝对持续时间?

这只是字节数,您应该自己计算适当的大小

  

此外,从我打电话的时候,我可以期待多少延迟   AudioRecord.startRecording()直到它真正开始录制   数据?

没有完美的答案。这取决于实际的设备和操作系统版本。音频录制是作为专用过程实现的,您的命令和记录数据通过IPC,通常具有不可预测的延迟。 Android中有一个nice articles音频延迟(它们主要是关于播放,但我想它也可以插入到录音中)。