2013-04-08 2 views
1

В настоящее время я столкнулся с серьезной проблемой. Мне нужно использовать 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). Может быть, я мог бы что-то сделать, но я точно не знаю, где и как.

Я мог бы также решить проблему, просто комментируя строку, получающую название аудиоустройств, но гораздо сложнее определить конкретный аудиовход без его имени, чтобы показать пользователю.

EDIT:

Вот общий процесс: я вызываю функцию из 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

ответ

-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.

 Смежные вопросы

  • Нет связанных вопросов^_^