2013-04-08 84 views
1

我目前面臨一個難題。我需要在法國Windows環境中使用Pyaudio,默認情況下,音頻設備的名稱包含éè音頻設備中的特殊字符名稱:Pyaudio

這是我得到的,當特殊字符出現的錯誤:

u=self.p.get_device_info_by_index(e) 
    File "C:\Python27\lib\site-packages\pyaudio.py", line 977, in get_device_info_ 
by_index 
    pa.get_device_info(device_index) 
    File "C:\Python27\lib\site-packages\pyaudio.py", line 987, in _make_device_inf 
o_dictionary 
    print device_info.name 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 13: invalid 
continuation byte 

這不會是如果我能訪問的代碼有問題(我需要添加非盟「......」在我猜測我在串串的前面)。

問題是,我查看了Pyaudio代碼,導致錯誤的方法在pyd文件(_portaudio.pyd)中定義,因此我無法修改它!

我試圖下載_portaudio自己編譯它,但我發現的分佈是用C編碼的,而且很重(我不知道關於C的第一件事)。也許我可以在那裏做點什麼,但我不知道在哪裏以及如何。

我也可以通過評論獲取音頻設備名稱的行來處理問題,但要識別沒有名稱的特定音頻輸入顯示給用戶會更困難。

編輯:

這裏是整個過程: 我調用函數從pyaudio:

 import pyaudio 

     self.p= pyaudio.PyAudio() 

     i=self.p.get_device_count() 

     for e in range(i): 
      u=self.p.get_device_info_by_index(e) 

這將導致我在其中調用該方法的pyaudio模塊:

device_info.name 

device_info是_portaudio.pyd中定義的對象。 由於特定音頻設備的名稱包含「é」或「è」(謝謝您的窗口),並且_portaudio.pyd未經過編碼處理這些字符。它返回錯誤:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 13: invalid 
    continuation byte 
+0

你有沒有找到解決方案@Jdawleer,我有同樣的問題。 – Basj 2013-12-27 14:07:05

回答

-1

我面對完全相同的問題。在我的情況下,在音頻設備名稱中有中文字符,並且當我發生UnicodeDecodeError時print device_info.name

這是我的解決方案。使用pymedia而不是pyaudio。試試這個:

>>> import pymedia 
>>> dict_list = pymedia.audio.sound.getIDevices() 
>>> print dict_list 
({'name': '\xc2\xf3\xbf\xcb\xb7\xe7 (Realtek High Definition', 'channels': 2, 'manufId': '1', 'formats': 1048575, 'id': 0, 'productId': '65'},) 
>>> dict_list = pymedia.audio.sound.getODevices() 
>>> print dict_list 
({'name': '\xd1\xef\xc9\xf9\xc6\xf7 (MV USB AUDIO)', 'channels': 2, 'manufId': 'ffff', 'formats': 1048575, 'id': 0, 'productId': 'ffff'}, {'name': '\xd1\xef\xc9\xf9\xc6\xf7 (Realtek High Definition', 'channels': 2, 'manufId': '1', 'formats': 1048575, 'id': 1, 'productId': '64'}) 

我使用python 2.7。