2012-03-29 78 views
4

我想要構建一個小型Python程序,可以收聽和分析計算機上正在播放的音頻,例如,從任何媒體播放器中播放音頻。使用Python分析當前正在播放的音頻

我知道在Windows上可以使用DirectShow,但我不確定如何從Python使用它。不過,我最好喜歡一種不使用DirectX的跨平臺方式。

+0

這不會是一個跨平臺的方式成爲可能,這是很難想象,你就可以做到這一點在Python兩種。 – kindall 2012-03-29 19:37:32

回答

6

一般來說,要從聲卡「聽東西」,你將不得不使用一些音頻工具包/模塊,通常,你最終會設置一個記錄進程播放例程(你可以忽略播放當然)

如果你的應用程序不是一個很難實時的應用程序(也就是說你可以錯過輸入的幾個樣本),你可以從PyAudio的「記錄幾秒鐘的音頻開始並保存到文件「示例來自their website
所以你的情況,你會:

  1. 錄製緩衝
  2. 過程中它
  3. 如果終止條件不滿足,回到(1)。

但是,在這種情況下,
(您可能已經注意到),你會從輸入丟失樣本,而你正在做的處理,因爲在這段時間裏,你是不是記錄什麼。
根據你的應用程序,你可以逃避這一點......對於PyAudio尤其如此,因爲目前它只支持阻塞模式,所以如果你想要實時(ISH)操作,你將不得不使用線程。

如果您的實時規格更加嚴格(即,即使輸入了幾個樣本,您也不會承受損失),您仍然可以使用「記錄處理 - [播放]」例程,但是這次您會需要在線程中完成,並通過LIFO堆棧(後進先出或Deque)與主進程通信。

它會去是這樣的:

記錄線程:

  1. 錄製緩衝
  2. 推動從(1)

雙端隊列

  • 重複數據主要工藝:

    1. 如果雙端隊列有緩衝區,然後
      1. 從雙端隊列拉緩衝
      2. 過程中它
    2. 從(1)

    這樣重複,你的處理可以繼續按照自己的節奏錄製線程不斷填充緩衝區並將其推送到Deque上。

    Python的好消息是Deque是線程安全的,因此當主進程和線程同時嘗試訪問Deque時,您不會遇到任何同步問題。

    再次, 根據您的應用程序,您可能還需要轉向更快的硬件,例如那些基於ASIO protocol的硬件。

    最後,
    您還需要稍微修改一下處理算法,以考慮您現在使用的是幀而不是一個緩衝區......因此,要保持順暢,您必須保存您的操作狀態從一幀到下一幀。欲瞭解更多信息,可以看到"overlap-add" method

    所有最優秀的

  • +0

    感謝您的詳細解釋!按照您的建議,我最終使用了PyAudio並啓用了聲卡的立體聲混音(http://www.howtogeek.com/howto/39532/how-to-enable-stereo-mix-in-windows-7-to-record-音頻/)聆聽當前音頻。結果如下:http://julianapena.com/2012/03/arduino-python-soundlight/ – 2012-03-30 03:27:00

    相關問題