android - 如果 AudioRecord API 中的数据没有被读取但正在连续录制,它是否会丢失任何音频帧?

标签 android audio latency audiorecord

这个问题对我来说非常重要,因为我想让从 AudioRecord API 接收的音频帧与绝对时间无关。所以,基本上问题是假设我调用了 AudioRecord.startRecording()。执行此操作后,我启动一个线程(称为 Thread1),开始使用 AudioRecord.read(...) 从 AudioRecorder 实例读取音频帧。 。当我的应用程序运行时,假设我的 Thread1 停滞了 500 毫秒。当Thread1恢复时,我会丢失一些音频数据还是AudioRecord维护一个缓冲区来处理这个问题(我对此有很大的插入)?

  1. 如果是,AudioRecord 维护的缓冲区大小是多少?
  2. 它是根据设备的 AudioRecord 帧大小或某个绝对持续时间来定义的吗?
  3. 此外,从调用 AudioRecord.startRecording() 到它实际开始记录数据,预计会有多少延迟?

我知道我问了很多问题,如果有人能够真正回答这些问题,我将非常感激。

最佳答案

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

bufSz = samplingFreqHz * sampleSize * channelNum * bufCapacitySec;

例如要保存 5 秒以 44100Hz 采样的立体声 16 位 PCM,您需要 44100 * 2 * 2 * 5 = 882000 字节。因此,只需决定您的读取器线程休眠多长时间,并为 AudioRecord 提供足够的缓冲区大小,以在休眠期间累积所有数据。

最重要的是

If yes, what is the size of the buffer that the AudioRecord maintains?

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

Is it defined in terms of the frame size for the AudioRecord for the device or some absolute time duration?

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

Also, how much latency can I expect from the time I call AudioRecord.startRecording() till when it actually starts recording the data?

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

关于android - 如果 AudioRecord API 中的数据没有被读取但正在连续录制,它是否会丢失任何音频帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900416/

相关文章:

java - 如何在java类中创建FileInputStream和FileOutputStream

jquery - 仅在可见div时播放声音文件?

android - setSpeakerphoneOn()在2.1上不起作用,在2.3上不起作用

java - 如何测量单向延迟?

c - 单个主机的阻塞与非阻塞 UDP 套接字

java - Apache Flink 的吞吐量和延迟

android - 动画结束后更改 View 位置

android - 如何去除按钮后面的边框?

java - 初始化由函数 Java for android 检索的类

javascript - html 5 音频文件播放完毕后重定向到新页面