2014-02-05 19 views
6

Auflistung Bei der Verwendung von PyAudio (Portaudio-Bindung) mit ASIO + Directsound-Unterstützung, diesen Code:PyAudio 'utf8' Fehler, wenn Geräte

import pyaudio 

p = pyaudio.PyAudio() 
for i in range(p.get_device_count()): 
    print p.get_device_info_by_index(i) 

... erzeugt diesen Fehler:

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

Wie Können wir dieses Problem lösen?


Das Problem von "pyaudio.py" kommen kann, Linie 990, aufgrund einer unsucessful utf8 Decodierung:

  return {'index' : index, 
        'structVersion' : device_info.structVersion, 
        'name' : device_info.name, 

Diese Antwort hier Special characters in audio devices name : Pyaudio ("nicht PyAudio verwenden ") ist nicht zufriedenstellend.


Traceback

... 
{'defaultSampleRate': 44100.0, 'defaultLowOutputLatency': 0.0, 'defaultLowInputLatency': 0.12, 'maxInputChannels': 2L, 'structVersion': 2L, 'hostApi': 1L, 'index': 8, 'defaultHighOutputLatency': 0.0, 'maxOutputChannels': 0L, 'name': u'Microphone interne (Conexant 20672 SmartAudio HD)', 'defaultHighInputLatency': 0.24} 
Traceback (most recent call last): 
    File "D:\test\test.py", line 5, in <module> 
    print p.get_device_info_by_index(i) 
    File "C:\ProgramData\Anaconda\lib\site-packages\pyaudio.py", line 977, in get_device_info_by_index 
    pa.get_device_info(device_index) 
    File "C:\ProgramData\Anaconda\lib\site-packages\pyaudio.py", line 990, in _make_device_info_dictionary 
    'name' : device_info.name, 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte 
+0

Zeigen Sie die vollständige Traceback ... – geoffspear

+0

Ich habe die Traceback @Wooble – Basj

+0

Die Traceback stimmt nicht mit Ihrem Code überein, aber der Fehler sieht intern Pyaudio. Hast du versucht, einen Fehlerbericht mit ihnen einzureichen? – geoffspear

Antwort

5

Der Fehler 'ungültig Fortsetzung Byte' lässt mich denken, dass der Text für diesen bestimmten Index beschädigt ist.

Wenn Sie die Datei pyaudio.py ändern können (oder die Datei pyaudio.py nur den Namen zurückgeben), können Sie möglicherweise versuchen, die UTF-8-Dekodierung selbst zu handhaben, indem Sie "Unicode Dammit" verwenden. . Es ist ziemlich gut zu schätzen, was die Codierung sein kann. Hier ist ein Link zu ihrem Tutorial (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit)

Ich denke, der Code genau wie das Tutorial aussehen:

from bs4 import UnicodeDammit 

dammit = UnicodeDammit(audiodevicename) 
print(dammit.unicode_markup) ## Wéird Device Name! 
+0

Hölle Ich habe keine Ahnung, ob diese Antwort OP helfen wird, aber +1 für die Erwähnung dieser Bibliothek, von der ich keine Ahnung hatte. Nett! – Fenikso

+0

+1, aber leider hat es das Problem nicht gelöst ... – Basj

0

Ich denke, hier der Hinweis

ist

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

Aus welchem ​​Grund auch immer etwas von get_device_info_by_index() zurück (wahrscheinlich das name Feld) enthält das Byte 0xe9, die, wenn Sie interpretieren die Zeichenfolge von Bytes als UTF8, bedeutet ein "Fortsetzung Byte". Dies bedeutet, dass einige gültige Bytes erwartet werden, die dem 0xe9 folgen. gültige Bytes bedeutet eine Sequenz von Bytes, die ein zulässiges UTF8-Zeichen darstellt. Z.B.

http://hexutf8.com/?q=e981a8

verwendet 0xe9 mit einigen gültigen Fortsetzung Bytes.