아래의 코드는 버퍼 언더런을 계속 발생시킵니다. synth_instance.play는 크기가 float (-1,1) 인 인터리브 된 스테레오 프레임 목록을 반환합니다 (frames_num * 2).Python/PyAudio - 버퍼 언더런
저는 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)
우리 모두는 파이썬이 느리다는 것을 알고 있지만, 파이썬을 사용하여 실시간으로 많은 것을 할 수 있습니다. [여기] (https://www.youtube.com/watch?v=YT-zAX3S850)'while' loop python이 느리다'for' – ederwander
진짜 지연 시간이 짧은 응용 프로그램을 작성하려면 파이썬을 사용하지 않아야합니다. 아니면 중요한 코드를 C로 작성하고 확장을 사용해야합니다. . 어쨌든, 당신은 어떤 대기 시간과 어떤 종류의 작업/오디오 스트림에서 어떤 작업을 수행하는지 언급하지 않았으므로, 당신이하려고하는 것이 파이썬에서 실행 가능하다면 다른 사람들이 말하는 것은 불가능합니다. – toes