Android 如果AudioRecord API中的数据未被读取,但仍在连续录制,则该API是否会丢失任何音频帧?

Android 如果AudioRecord API中的数据未被读取,但仍在连续录制,则该API是否会丢失任何音频帧?,android,audio,latency,audiorecord,Android,Audio,Latency,Audiorecord,这个问题对我来说非常重要,因为我想让我从AudioRecordAPI接收到的音频帧独立于绝对时间。所以,基本上问题是,假设我调用了AudioRecord.startRecording()。执行此操作后,我启动一个线程(称之为Thread1),该线程开始使用AudioRecord.read(…)从AudioRecorder实例读取音频帧。当我的应用程序运行时,假设我的Thread1暂停500毫秒。当Thread1恢复时,我是否会丢失一些音频数据,或者AudioRecord会保留一个缓冲区来处理这个

这个问题对我来说非常重要,因为我想让我从
AudioRecord
API接收到的音频帧独立于绝对时间。所以,基本上问题是,假设我调用了
AudioRecord.startRecording()
。执行此操作后,我启动一个线程(称之为Thread1),该线程开始使用
AudioRecord.read(…)
AudioRecorder
实例读取音频帧。当我的应用程序运行时,假设我的Thread1暂停500毫秒。当Thread1恢复时,我是否会丢失一些音频数据,或者AudioRecord会保留一个缓冲区来处理这个问题(我对此有很大的推动)

  • 如果是,则
    录音
    维护的缓冲区大小是多少
  • 它是根据设备的
    音频记录的帧大小或某个绝对持续时间来定义的吗
  • 另外,从调用
    AudioRecord.startRecording()
    到它实际开始记录数据,我可以期望有多少延迟

  • 我知道我问了很多问题,如果有人能回答我的问题,我将不胜感激。

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

    bufSz = samplingFreqHz * sampleSize * channelNum * bufCapacitySec;
    
    例如,要保持以44100Hz采样的5秒立体声16位PCM,需要44100*2*2*5=882000字节。因此,只需确定读卡器线程的睡眠时间,并提供足够的缓冲区大小,以便
    音频录制
    在睡眠期间积累所有数据

    最后

    如果是,音频记录保留的缓冲区大小是多少

    将适当的大小传递给构造函数调用是您的责任

    它是根据音频记录的帧大小来定义的吗 设备或某个绝对持续时间

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

    另外,我可以期望从我呼叫的时间中得到多少延迟
    AudioRecord.startRecording()
    直到它真正开始录制 数据


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

    我如何知道
    音频录制写入缓冲区的帧大小?它是否等于我们从
    录音中得到的。getMinBufferSize(…)
    ?@Swapnil我想这就是你所说的。它与AudioRecord.getMinBufferSize()不同,但它们之间存在某种关联。