以下代码会导致缓冲区欠载。 synth_instance.play返回大小为(frames_num * 2)的浮点数(-1,1)中的交错立体帧列表。
在我看来,由于某种原因,stream.write不会写出我提供的所有帧。
我尝试在回调模式下使用pyaudio,但我不知道如何及时为它提供足够的帧。我的主循环无法赶上通过音频块队列提供音频。音频回调总是比我提供的音频块快得多。
#!/usr/bin/python3
import pyaudio
import time
import struct
from synth import synth
from time import sleep
from time import clock
p = pyaudio.PyAudio()
sample_rate = 44100
frames_num = 2205
synth_instance = synth();
stream = p.open(rate=sample_rate,
channels=2,
format=pyaudio.paFloat32,
frames_per_buffer=frames_num,
output=True)
while (True):
audio = synth_instance.play_note(-12, sample_rate, frames_num)
data = struct.pack('f'*len(audio), *audio)
stream.write(data, frames_num)
答案 0 :(得分:0)
OP在这里。我会发布我认为是人们谷歌搜索的答案。如果我错了,如果有更多知识渊博的人正在阅读本文,请更正我,因为我只是学习编程音频和低级编程。
事实上,Python对于任何实时音频来说都太慢了。
如果您不知道如何优化代码,即使C也可能太慢。
如果您在C中进行编程,那么例如如果您使用环形缓冲区将东西从主循环移动到音频线程那么似乎在主循环中执行太多浮点运算会导致音频线程赶上,导致口吃。
所以答案是让你的主循环更快或使你的音频线程更慢。