5

こんにちは、解決できない PyAudio の問題に直面しています。ネットワーク経由で使用すると (しばらくすると) クラッシュします。私が得るエラーは

スレッド Thread-1 の例外:
トレースバック (最新の呼び出しが最後):
  ファイル「C:\Python27\lib\threading.py」、552 行目、__bootstrap_inner 内
    self.run()
  ファイル「C:\Python27\lib\threading.py」、505 行目、実行中
    self.__target(*self.__args, **self.__kwargs)
  サーバー内のファイル「C:\Users\maboroshi\Desktop\myChat\chat.py」の71行目
    frames_per_buffer = チャンク)
  ファイル「C:\Python27\lib\site-packages\pyaudio.py」、714 行目、開いている
    stream = Stream(self, *args, **kwargs)
  ファイル「C:\Python27\lib\site-packages\pyaudio.py」、396 行目、__init__ 内
    self._stream = pa.open(**引数)
IOError: [Errno デバイスを使用できません] -9985

私のコードは以下のとおりです(ほとんどの場合:-P

これは、データを復号化し、接続を管理するためのものです

def decrypt_my_message(msg):
    iv = "1234567812345678"
    キー = your_friends_key
    len(key) が (16, 24, 32) にない場合:
        raise ValueError("キーは 16、24、または 32 バイトでなければなりません")
    if (len(msg) % 16) != 0:
        raise ValueError("メッセージは 16 バイトの倍数でなければなりません")
    len(iv) != 16 の場合:
        raise ValueError("IV は 16 バイトでなければなりません")
    暗号 = AES.new(キー、AES.MODE_CBC、iv)
    平文 = cipher.decrypt(msg)
    平文を返す

### サーバー機能 ###
デフサーバー():
    ホスト = ''
    ポート = 9001
    ### ソケットの初期化
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((ホスト、ポート))
    server_socket.listen(5)
    ### 受信ループを開始
    read_list = [サーバーソケット]
    True の間:
        読み取り可能、書き込み可能、​​エラー = select.select(read_list, [], [])
        for s in readable:
            s が server_socket の場合:
                conn, addr = s.accept()
                read_list.append(接続)
                print "接続元", addr
            そうしないと:
                メッセージ = conn.recv(2024)
                メッセージの場合:                
                    cmd、msg = ord(msg[0])、msg[1:]
                    cmd == CMD_MSG の場合:
                        listb1.insert(END, decrypt_my_message(msg.strip()) + "\n")
                        listb1.yview(END)
                    elif コマンド == CMD_AUDIO:
                        #d = speex.Decoder()
                        #d.initialize(speex.SPEEX_MODEID_WB)
                        p = pyaudio.PyAudio()
                        ストリーム = p.open(フォーマット = フォーマット、
                                        チャネル = チャネル、
                                        率 = 率、
                                        入力 = 真、
                                        出力 = 真、
                                        frames_per_buffer = チャンク)
                        stream.write(decrypt_my_message(msg), chunk) # データをスピーカーに書き戻す
                そうしないと:
                    s.close()
                    read_list.remove(s)

これは、暗号化されたオーディオを接続して送信するためのものです

def encrypt_my_audio_message(msg):
    キー = your_key
    iv = '1234567812345678'
    aes = AES.new(キー、AES.MODE_CBC、iv)
    エンコーダー = PKCS7Encoder()
    pad_text = エンコーダ.エンコード(メッセージ)
    msg = aes.encrypt(pad_text)
    メッセージを返す

def connectToServer():
    クライアント_ポート = 9001
    CLIENT_HOST = str(entryhost.get())
    グローバル
    試す:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((CLIENT_HOST, CLIENT_PORT))
        print "接続済み\n"
    を除外する:
        print "接続できませんでした"

### クライアント機能 ###        
デフォルト クライアント (コマンド、メッセージ):
    試す:
        s.send(コマンド + メッセージ)
    を除外する:
        print "接続されていません"

デフ sendAudio():
    p = pyaudio.PyAudio()
    ストリーム = p.open(フォーマット = フォーマット、
                    チャネル = チャネル、
                    率 = 率、
                    入力 = 真、
                    出力 = 真、
                    frames_per_buffer = チャンク)
    data = stream.read(チャンク)
    encrypt_my_audio_message(データ) を返します
## stream.stop_stream()
## ストリーム.クローズ()
## p.terminate()

def keypress(イベント):
    if event.keysym == 'エスケープ':
        root.destroy()
    #x = event.char
    if event.keysym == 'Control_L':
        #print("データを送信しています...")
        client(chr(CMD_AUDIO), sendAudio())
        #print("データが送信されました!")

なぜこれが起こるのかについてのアイデアは最も役に立ちます

4

2 に答える 2

0

私が思いつくのは、select でブロックするスレッドが混在していて、ループが少し奇妙に見えるということです。両方向で多くのことが進行しています - パケットの出入りの流れをギアがかみ合うように機能させることに集中してください。どちらでもないと予想されます。

以下からインスピレーションを得られるかもしれません:

于 2011-12-09T04:07:21.260 に答える
0

複数の PyAudio オブジェクトを作成し、複数のストリームを閉じずに開いているため、問題が発生していると思います。

1 つの PyAudio オブジェクトと 1 つのストリームを作成し、それらのオブジェクトを再利用する必要があります。

于 2012-08-09T02:12:56.423 に答える