Python Language
파이 오디오
수색…
소개
PyAudio는 플랫폼 간 오디오 I / O 라이브러리 인 PortAudio에 Python 바인딩을 제공합니다. PyAudio를 사용하면 Python을 사용하여 다양한 플랫폼에서 오디오를 재생하고 녹음 할 수 있습니다. PyAudio는 다음으로부터 영감을 얻었습니다.
1.pyPortAudio / fastaudio : PortAudio v18 API를위한 파이썬 바인딩.
2.tkSnack : Tcl / Tk와 Python을위한 크로스 플랫폼 사운드 툴킷.
비고
주 : stream_callback은 (메인 스레드로부터) 별도의 스레드에서 호출됩니다. stream_callback에서 발생하는 예외는 다음과 같습니다.
1, 디버깅을 지원하기 위해 표준 오류에 대한 역 추적을 .print
2. 메인 스레드에서 (어떤 시점에서) 던져 질 예외를 대기열에 넣는다.
3. PortAudio로 paAbort를 보내 스트림을 중단하십시오.
참고 : 비 블로킹 작업을 사용하는 경우 Stream.read () 또는 Stream.write ()를 호출하지 마십시오.
자세한 내용은 PortAudio의 콜백 서명을 참조하십시오.
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710
콜백 모드 오디오 I / O
"""PyAudio Example: Play a wave file (callback version)."""
import pyaudio
import wave
import time
import sys
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# define callback (2)
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return (data, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
콜백 모드에서 PyAudio는 새로운 오디오 데이터가 필요하거나 (녹음 된) 오디오 데이터가 필요할 때마다 지정된 콜백 함수 (2)를 호출합니다. PyAudio는 별도의 스레드에서 콜백 함수를 호출합니다. 이 함수는 다음 시그너처 callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
가지며 오디오 데이터의 frame_count
프레임을 포함하는 튜플과 재생 / 기록 할 프레임이 더 있는지 여부를 나타내는 플래그를 반환해야합니다.
pyaudio.Stream.start_stream () (4)을 사용하여 오디오 스트림 처리를 시작합니다.이 함수는 pyaudio.paComplete를 반환 할 때까지 반복적으로 콜백 함수를 호출합니다.
스트림을 활성화 상태로 유지하려면 주 스레드가 종료하지 않아야합니다 (예 : 절전 모드).
블로킹 모드 오디오 I / O
"" "PyAudio 예제 : 웨이브 파일 재생" "
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
PyAudio를 사용하려면 먼저 pyaudio.PyAudio () (1)를 사용하여 PyAudio를 인스턴스화합니다.이 프로그램은 portaudio 시스템을 설정합니다.
오디오를 녹음하거나 재생하려면 pyaudio.PyAudio.open () (2)을 사용하여 원하는 오디오 매개 변수로 원하는 장치에서 스트림을 엽니 다. 이것은 오디오를 재생하거나 녹음하기 위해 pyaudio.Stream 을 설정합니다.
pyaudio.Stream.write ()를 사용하여 오디오 데이터를 스트림에 기록하거나 pyaudio.Stream.read ()를 사용하여 스트림에서 오디오 데이터를 읽음으로써 오디오를 재생합니다. (삼)
" blocking mode "에서 각 pyaudio.Stream.write () 또는 pyaudio.Stream.read () 는 주어진 / 요청 된 모든 프레임이 재생 / 기록 될 때까지 차단됩니다. 또는 즉시 오디오 데이터를 생성하거나 녹음 된 오디오 데이터를 즉시 처리하려면 "콜백 모드"를 사용 하십시오 (콜백 모드 의 예 참조 )
스트림을 종료 재생 / 녹화, pyaudio.Stream.close ()을 일시 정지 pyaudio.Stream.stop_stream ()를 사용합니다. (4)
마지막으로, pyaudio.PyAudio.terminate () (5)를 사용하여 portaudio 세션을 종료하십시오.