android - AudioHardwareALSA::getInputBufferSize(...) 中的缓冲区计算

标签 android audio alsa

我正在查看 AudioHardwareALSA.cpp 中的 getInputBufferSize(...) 函数,它返回硬编码值 320。我的问题是:这个值是如何计算的?

我已经做了一些预考,但仍有一些问题。


sample_rate = 8000
format = S16_LE = 2 bytes/sample
period_time = 10000 us (guessing)
buffer_size = 2 * period_size
period_size = period_time * bytes/sec
buffer_size = 2 * (0.01 * sample_rate * 2) = 320 bytes.

我在代码中找不到period_time,所以一个问题是:它是在哪里定义的还是只是一个粗略的计算?

我还尝试添加更多采样率,即 16000 和 32000(以后可能会更多)。如何计算正确的最小缓冲区大小?所有采样率的延迟是否始终为 10 毫秒?

感谢任何帮助。

最佳答案

我相信谷歌首先实现了 NB-AMR 编码。后来他们增加了对 AAC 的支持。在 NB-AMR 的情况下,帧大小为 320 字节。 您可能知道,对于 NB-AMR: 采样率 = 8000 个样本/秒 帧持续时间 = 20ms 样本大小 = 2 字节 channel =单声道 所以,每一帧包含 8000 个样本/秒 * 0.02 秒 * 2 字节/样本/ channel * 1 channel = 320 字节

对于 AAC,这些参数不同,因此帧大小也不同

关于android - AudioHardwareALSA::getInputBufferSize(...) 中的缓冲区计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5340611/

相关文章:

java - 相对布局- android :layout_centerHorizontal ="true" and android:layout_centerVertical ="true" dont center the imageview

javascript - Nedd 通过单击 HTML5 模板中的一个按钮来播放音频剪辑和图像动画

java - 从IPCAM播放音频流的极端延迟

c++ - 在 C++ 中使用 ALSA 捕获默认音频流

android - 更新同一订阅中的 flatMap 并发限制

java - 无法运行程序 "...\keytool.exe": CreateProcess error=2

android - 在 android 的 nestedscrollview 中使用 3 个 recyclerviews 时滚动不流畅

C++ 在后台读取文件

linux - ALSA:snd_pcm_writei 调用时缓冲区不足

c++ - ALSA 的 snd_pcm_get_chmap 在 Ubuntu 18.04 上的默认设备(脉冲)上始终返回 NULL