2016-07-05 4 views
1

아래의 코드는 버퍼 언더런을 계속 발생시킵니다. 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) 

답변

0

여기 OP. 나는 그것에 대해 인터넷 검색에 대한 대답이라고 생각하는 것을 게시 할 것이다. 만약 내가 틀렸어 더 많은 knowlegdeable 누군가가 이것을 읽고있다. 나는 단지 오디오와 낮은 레벨의 프로그래밍을 배우는 중이다.

사실 파이썬은 모든 실시간 오디오 항목에 너무 느립니다.

코드를 잘 최적화하는 방법을 모르는 경우에도 C가 너무 느려질 수 있습니다.

예를 들어 ringbuffer를 사용하여 메인 루프에서 오디오 스레드로 물건을 옮기는 경우, 메인 루프에서 너무 많은 부동 소수점 연산을 수행하면 오디오 스레드가 말더듬을 일으키는 것을 잡아라.

답변은 메인 루프를 더 빠르게 만들거나 오디오 스레드를 느리게 만드는 것입니다.

+0

우리 모두는 파이썬이 느리다는 것을 알고 있지만, 파이썬을 사용하여 실시간으로 많은 것을 할 수 있습니다. [여기] (https://www.youtube.com/watch?v=YT-zAX3S850)'while' loop python이 느리다'for' – ederwander

+0

진짜 지연 시간이 짧은 응용 프로그램을 작성하려면 파이썬을 사용하지 않아야합니다. 아니면 중요한 코드를 C로 작성하고 확장을 사용해야합니다. . 어쨌든, 당신은 어떤 대기 시간과 어떤 종류의 작업/오디오 스트림에서 어떤 작업을 수행하는지 언급하지 않았으므로, 당신이하려고하는 것이 파이썬에서 실행 가능하다면 다른 사람들이 말하는 것은 불가능합니다. – toes