2017-11-21 18 views
0

많은 numpy 배열을 재생하려고하지만 일부 버퍼링이 있습니다. 예를 들어, 버퍼없이 많은 numpy 배열을 재생하는 방법

import numpy as np 
import sounddevice as sd 

fs=44100 
data = 0.5*np.random.uniform(-1,1,fs) 
for i in range(5): 
    sd.play(data, 44100) 

이 경우, 나는 한 numpy 배열을 사용하지만, 계속 놀고 싶어.

실제로 마이크를 사용하여 수십 마이크로 초 동안 사운드를 녹음하고 일부 응용 프로그램에서 변환 (사인파 추가 ...)하고 변환 된 데이터를 연속적으로 재생하려고합니다.

어떻게 버퍼링을 제거 할 수 있습니까?

답변

0

지속적으로 녹음하고 재생하려면 콜백 기능을 사용해야합니다.

import sounddevice as sd 
duration = 5.5 # seconds 

def callback(indata, outdata, frames, time, status): 
    if status: 
     print(status) 
    outdata[:] = indata 

with sd.Stream(channels=2, callback=callback): 
    sd.sleep(int(duration * 1000)) 

이 예는 단지 복사 출력 버퍼에 입력 버퍼를,하지만 당신은 물론 출력에 다시 할당하기 전에 임의의 신호를 조작 할 수 있습니다 다음 example in the documentation에서보세요 , 난 여기가 반복 해요 .

처리가 고정 된 블록 크기에 의존하는 경우 sd.Stream() 생성자에 명시 적으로 블록 크기를 설정해야합니다. blocksize=1024.

콜백에서 너무 많은 작업을하거나 (블록 크기가 너무 작은 경우) 버퍼 오버런/언더런이 발생했는지 여부를 알려주기 때문에 언제나 status 인수를 확인하는 것을 잊지 마십시오.