使用Python分析当前播放的音频

时间:2012-03-29 19:34:27

标签: python audio directshow

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

我知道这可以在Windows上使用DirectShow,但我不确定如何在Python中使用它。但是,我理想地喜欢不使用DirectX的跨平台方式。

1 个答案:

答案 0 :(得分:7)

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

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

  1. 录制缓冲区
  2. 处理它
  3. 如果不满足终止条件,请返回(1)。
  4. 但是,在这种情况下,
    (您可能已经注意到)在您进行处理时,您将丢失输入中的样本,因为在此期间,您没有记录任何内容。
    根据你的应用程序,你可以侥幸逃脱......对于PyAudio尤其如此,因为目前它只支持阻塞模式,所以如果你想要实时(ish)操作,你必须使用线程。

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

    它会是这样的:

    录制线程:

    1. 录制缓冲区
    2. 推送Deque上的数据
    3. 从(1)
    4. 重复

      主要流程:

      1. 如果Deque有缓冲区的话
        1. 从Deque
        2. 中拉出一个缓冲区
        3. 处理它
      2. 从(1)
      3. 重复

        通过这种方式,您的处理可以按照自己的节奏继续进行,同时录制线程不断填充缓冲区并将其推送到Deque上。

        Python的好消息是Deque是线程安全的,所以当你的主进程和线程试图同时访问Deque时,你不会遇到任何同步问题。

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

        最终,
        您还需要稍微修改一下处理算法,以考虑到您现在正在处理帧而不是一个缓冲区...因此,为了保持平稳,您必须将操作状态从一帧保存到下一个。有关详细信息,请参阅"overlap-add" method

        一切顺利