私は後でユーザー入力を介してサウンドをモジュレーションするために、コールバックメソッドを使用して純粋なサイントーンをストリームするためにpythonとpyaudioを使用しています。私がコードを実行すると、警告メッセージに関連したクラッキング音が1秒間に発生する以外はすべてうまくいきます。 ALSA lib pcm.c:7339:(snd_pcm_recover)アンダーランが発生しましたその後、サイントーンは正しくストリーミングされます。最初のポッピング音を取り除く方法についてのヒント? はここpyaudioのクラッキングサウンドサイントーン
import pyaudio
import time
import numpy as np
CHANNELS = 1
RATE = 44100
freq = 600
CHUNK = 1024
lastchunk = 0
def sine(current_time):
global freq,lastchunk
length = CHUNK
factor = float(freq)*2*np.pi/RATE
this_chunk = np.arange(length)+lastchunk
lastchunk = this_chunk[-1]
return np.sin(this_chunk*factor)
def get_chunk():
data = sine(time.time())
return data * 0.1
def callback(in_data, frame_count, time_info, status):
chunk = get_chunk() * 0.25
data = chunk.astype(np.float32).tostring()
return (data, pyaudio.paContinue)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=CHANNELS,
rate=RATE,
output=True,
stream_callback=callback)
stream.start_stream()
time.sleep(1)
stream.stop_stream()
stream.close()
乾杯
バッファアンダースタンは、通常、コード(コールバック)が次回のDAC送信に適時にオーディオデータを提供できなかったことを意味します。あなたのコールバックには、最初の数回または最初の数回の実行に時間がかかりますか? – Linuxios
もう一度見れば、 'time.sleep(1)'を取り除くとどうなりますか?これは、プログラムが1秒間応答しなくなり、コールバックが実行されなくなり、記述した問題が発生する可能性があります。 – Linuxios
よく私はストリームの長さを示すためにtime.sleep(int)が必要です。 stream.stop_stream()によって直ちにストリームが終了するので、time.sleepをゼロ長のストリームで削除します。実際には、time.sleep()の長さを変更しても、異なる動作にはなりません.... –