C++/Python中的声音监控
我在寻找一个API(或者一些信息,告诉我该从哪里开始),最终可以让我监控电脑播放的声音。
我的最终目标(其实这只是一个阶段性目标)是做一个示波器。
除了谷歌(搜索结果不太理想),我应该从哪里开始了解电脑处理声音的相关知识(特别是Mac电脑),以及如何获取这些声音。
谢谢!
2 个回答
我以前用过一个组合,里面有Soundflower和PyAudio,是为了类似的目的。
Soundflower的作用是把所有的声音输出都转到一个输入上,这样PyAudio就可以读取这些声音了。
如果你想用C++而不是Python,可以使用PortAudio,因为PyAudio就是基于这个库的。
正如 @cobbal 提到的,在 Mac OS X 上,你需要以某种方式使用 PortAudio 来获取正在播放的音频。另一种方法是使用一个有插件接口的音频播放器,然后把你的代码写成这个播放器的插件。不过,使用 CoreAudio 的解决方案应该可以让你监控 Mac 上播放的所有声音。
你的 CoreAudio 代码在 Windows 和 Linux 上是完全不可移植的。目前没有通用的解决方案。在 Windows 上,你可能想使用 WaveIn/WaveOut API,除非你有专业设备,那样的话你可能会想用 ASIO。在 Linux 上,我不太确定;我觉得你可能可以接入 ALSA/PulseAudio 来获取音频。除非你有专业设备,那样的话你可能会想用 JACK。
如果你想要一个可移植的解决方案,你可能需要认真考虑插件的选项。找一个在所有平台上都能用的免费媒体播放器,然后为它制作一个插件。
如果你想做一个示波器,你需要找一本关于数字信号处理("DSP")的书。你可能会想使用离散傅里叶变换("DFT")来从你的离散音频样本中提取频率信息;DFT 库通常被称为 "FFT" 库("FFT" 是 "快速傅里叶变换" 的缩写)。
我最喜欢的关于 DSP 的书是:Understanding Digital Signal Processing,作者是 Richard G. Lyons。
补充一下,很多媒体播放器都有“可视化”插件,其中一些是基于频率的显示。(有些甚至叫“scope”。)有没有可能已经有一个媒体播放器可以做到你想要的显示效果呢?