是否可以在缓冲区完全消耗之前停止 stream.write 函数?当我尝试这样做时,声音停止了,但 stream.write 函数永远不会返回。
这是一个工作示例,说明我想如何使用一个小类来播放纯音而不阻塞主线程。
import time
import sounddevice as sd
import numpy as np
from threading import Thread
toneduration = 10
samplerate = 44100
frequency = 440
amplitude = 0.5
sd.default.device = 1
sd.default.samplerate = samplerate
sd.default.channels = 2
class Sound(Thread):
def __init__(self):
Thread.__init__(self)
self.stream = sd.OutputStream()
self.stream.start()
vector1 = np.linspace(0, toneduration, toneduration * samplerate)
vector2 = amplitude * np.sin(2 * np.pi * frequency * vector1)
vector3 = np.array([vector2, vector2])
self.soundVector = np.ascontiguousarray(vector3.T, dtype=np.float32)
def run(self):
self.stream.write(self.soundVector)
print('end')
sound = Sound()
sound.start()
time.sleep(3)
sound.stream.close()
我可以播放给定持续时间的声音,但是如果我使用stream.close()
该函数手动停止流,则不会返回(print('end')
消息永远不会显示,线程也不会完成)
我必须改用回调吗?在那种情况下,我应该如何用 numpy 数组填充缓冲区?我阅读了文档中的代码示例,但我不知道该怎么做。