4

マイクからの音声を録音し、ネットワーク経由で送信してそこで再生する小さなプログラムを作成しました。このタスクには PyAudio を使用しています。ほとんど問題なく動作しますが、両方のコンピューターで、ALSA からアンダーランが発生したというエラーが発生します。私はそれについてたくさんグーグルで調べましたが、今ではアンダーランとは何かを知っています. しかし、私はまだ問題を解決する方法を知りません。ほとんどの場合、音は問題ありません。しかし、アンダーランが発生すると、少し奇妙に聞こえます。コードで注意すべきことはありますか? 単純なエラーをしているように感じて、それが恋しいです。

私のシステム: python: python3.3、OS: Linux Mint Debian Edition UP7、PyAudio v0.2.7

4

3 に答える 3

4

サウンドの同期を検討しましたか? コードを提供しなかったので、別のスレッドにタイマーが必要であり、次のような CHUNK_SIZE/RATE ミリ秒ごとのコードを実行する必要があると思います。

silence = chr(0)*self.chunk*self.channels*2 
out_stream = ... # is the output stream opened in pyaudio

def play(data):
    # if data has not arrived, play the silence
    # yes, we will sacrifice a sound frame for output buffer consistency
    if data == '':
        data = silence
    out_stream.write(data) 

このコードが定期的に実行されると仮定すると、このようにして、出力オーディオ ストリームに常に何らかのオーディオ データが供給されます。

于 2013-12-17T22:22:26.743 に答える
2

必要に応じて無音部分を埋めることで、アンダーランを防ぐことができます。それは次のようになります。

#...
data = s.recv(CHUNK * WIDTH) # Receive data from peer
stream.write(data) # Play sound
free = stream.get_write_available() # How much space is left in the buffer?
if free > CHUNK # Is there a lot of space in the buffer?
    tofill = free - CHUNK
    stream.write(SILENCE * tofill) # Fill it with silence
#...
于 2014-01-16T20:53:24.630 に答える