我目前面临一个难题。我需要在法语Windows环境中使用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
如果我可以访问代码,这将不是问题(我想我会在字符串链的前面添加u“ ...”)。
问题是我查看了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
最佳答案
我正面临着同样的问题。就我而言,音频设备的名称中有中文字符,当我print device_info.name
时发生UnicodeDecodeError
这是我的解决方案。
使用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。
关于python - 音频设备名称中的特殊字符:Pyaudio,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15878370/