python - 用Python分析当前播放的音频

标签 python audio directshow

我想构建一个小型 Python 程序,它可以收听和分析计算机上当前正在播放的音频,例如来自任何媒体播放器的音频。

我知道这可以在 Windows 上使用 DirectShow,但我不确定如何在 Python 中使用它。但是,理想情况下,我想要一种不使用 DirectX 的跨平台方式。

最佳答案

一般来说,要从你的声卡“听一些东西”,你将不得不使用一些音频工具包/模块,通常,你最终会设置一个记录-处理-播放例程(你可以省略播放当然)

如果您的应用程序不是硬实时应用程序(即您可以承受从输入中丢失一些样本),您可以从 PyAudio 的“录制几秒钟的音频并将其保存到文件”示例开始their website .
所以在你的情况下,你会:

  1. 记录缓冲区
  2. 处理它
  3. 如果不满足终止条件,则返回(1)。

但是,在这种情况下,
(您可能已经注意到)在进行处理时,您可能会丢失输入样本,因为在此期间,您没有记录任何内容。
根据您的应用程序,您可以摆脱它......对于 PyAudio 尤其如此,因为目前它仅支持阻塞模式,因此如果您想要实时(ish)操作,您将不得不使用线程。

如果您的实时规范更严格(即您不能承受从输入中丢失甚至几个样本)您仍然会使用“记录-处理-[播放]”例程,但这次您需要在线程中执行此操作并让它通过 LIFO 堆栈(后进先出或 Deque)与您的主进程通信。

它会是这样的:

记录线程:

  1. 记录缓冲区
  2. 将数据推送到双端队列
  3. 从 (1) 开始重复

主要流程:

  1. 如果双端队列有缓冲区那么
    1. 从双端队列中提取缓冲区
    2. 处理它
  2. 从 (1) 开始重复

通过这种方式,您的处理可以按照自己的节奏进行,同时记录线程不断填充缓冲区并将它们推送到双端队列。

对于 Python 来说,好消息是 Deque 是线程安全的,因此当您的主进程和线程尝试同时访问 Deque 时,您不会遇到任何同步问题。

再次, 根据您的应用程序,您可能还需要转向更快的硬件,例如那些基于 ASIO protocol 的硬件。 .

最终,
您还需要稍微修改您的处理算法,以考虑到您现在使用的是帧而不是一个缓冲区......因此,为了让事情顺利进行,您必须将操作状态从一帧保存到下一个。有关更多信息,请参阅 "overlap-add" method

一切顺利

关于python - 用Python分析当前播放的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932222/

相关文章:

每秒音频样本?

ffmpeg - 我将如何制作屏幕录像机?

C#.NET DirectShow 库 : Saving custom graph to a file

python - 循环字典元组中的所有键

python 2 与 3 : Replace list comprehensions with map()?

winapi - Console.Beep() - 声音不通过 RDC 重定向

android - 在 Android 中同时播放音频和视频

DirectShow Source 过滤器使用 Dekstop 窗口作为源

python - 使用 scipy.integrate.quad 时为 "argument must be a callable function"

python - 如何更改 Django 模型中的选项?