如何捕获麦克风缓冲区原始数据? [关闭]

Posted

技术标签:

【中文标题】如何捕获麦克风缓冲区原始数据? [关闭]【英文标题】:How to capture the microphone buffer raw data? [closed] 【发布时间】:2017-04-26 10:28:00 【问题描述】:

我需要捕获麦克风提供的原始数据(每隔几毫秒)。对于 Python 的偏好,但它也可以在 C/C++ 中。我正在使用 Linux/macOS。

如何捕获音频波(麦克风输入)以及它将是什么类型的数据?纯字节?包含一些数据的数组?

我想对麦克风信号进行实时幅度分析和(如果幅度达到确定值)实时 fft,但我不知道麦克风为我提供什么数据和多少数据的概念。

我看到很多设置为捕获 44.1kHz 音频的代码,但它会捕获所有这些数据吗?获取的数据部分取决于它是如何编程的?

【问题讨论】:

This question 包含用于捕获麦克风数据的工作 Python 代码。可能对你有用。 如果您想要 C 或 Python 答案,为什么要添加 C++ 标签? 它也可以是 C++。编辑了问题。 @kazemakase 感谢您的建议。 “如何用任何编程语言编写的代码录制声音”对于本网站来说是一个过于宽泛的问题。 【参考方案1】:

“我需要捕获麦克风提供的原始数据(每隔几毫秒)”

不,你没有。那是行不通的。即使您每毫秒捕获一次数据,恰好是 1000 微秒的倍数(无抖动),您的音频质量也会非常糟糕。 1000 Hz(每毫秒一次)的采样频率将奈奎斯特频率限制为 500 Hz。太低了。

“我想做实时幅度分析”。好吧,您忽略了 500 Hz 以上分量的幅度,这大约是可听频率的 98%。

“实时 fft” - 同样的问题,也会错过 98%。

您无法处理这样的原始音频。您必须依靠声卡来做繁重的工作,才能获得计时权。它可以每 21 微秒 采样一次声音,精度为微秒。您可以使用 ALSA 或 PulseAudio 或其他一些选项(在 Linux 上为您提供声音)与声卡对话。但是那里的建议会偏离主题。

【讨论】:

非常感谢您的回答。我只是很难理解麦克风的工作原理以及如何获得“高质量”数据。你有任何文章谈论这个,所以我可以了解它是如何工作的? 我正在阅读有关缓冲区大小的信息,大多数情况下是 1024。这是什么意思? 表示有一个缓冲区,长度为 1024 个元素,每个元素可能是一个样本。 @Colin__s 每个元素都是一个波?每秒 1024 个元素?我不明白。 不管他使用什么措辞,对我来说似乎很明显他想“每隔几毫秒”读取声卡提供的样本,而不是自己以那个速率对麦克风信号电平进行采样!

以上是关于如何捕获麦克风缓冲区原始数据? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获麦克风缓冲区

为啥麦克风关闭时基频和幅度不为零?

从 C 中的麦克风获取原始数据块

从麦克风捕获声音时不执行 QAudioInput::notify()

使用 Google Speech to Text API 从 Web 应用程序中的麦克风捕获实时音频 [关闭]

如何在 WASAPICaptureSharedEventDriven 中保存原始格式的音频文件