Python Language
pyaudio
Szukaj…
Wprowadzenie
PyAudio zapewnia powiązania Python dla PortAudio, wieloplatformowej biblioteki we / wy audio. Dzięki PyAudio możesz łatwo używać Pythona do odtwarzania i nagrywania dźwięku na różnych platformach. PyAudio jest inspirowany:
1.pyPortAudio / fastaudio: Powiązania w języku Python dla interfejsu API PortAudio v18.
2.tkSnack: wieloplatformowy zestaw narzędzi dźwiękowych dla Tcl / Tk i Python.
Uwagi
Uwaga: stream_callback jest wywoływany w osobnym wątku (od głównego wątku). Wyjątki występujące w wywołaniu stream_callback będą:
1. wydrukuj ślad po błędzie standardowym, aby ułatwić debugowanie,
2. zaznacz wyjątek, który ma zostać zgłoszony (w pewnym momencie) w głównym wątku, i
3.. Zwróć paAbort do PortAudio, aby zatrzymać strumień.
Uwaga: Nie wywoływaj Stream.read () ani Stream.write (), jeśli korzystasz z operacji nieblokującej.
Zobacz: podpis wywołania zwrotnego PortAudio, aby uzyskać dodatkowe informacje:
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710
Tryb oddzwaniania Audio 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()
W trybie oddzwaniania PyAudio wywoła określoną funkcję oddzwaniania (2), ilekroć potrzebuje nowych danych audio (do odtworzenia) i / lub gdy dostępne są nowe (nagrane) dane audio. Zauważ, że PyAudio wywołuje funkcję zwrotną w osobnym wątku. Funkcja ma następujące callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
sygnatury callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
i musi zwrócić krotkę zawierającą frame_count
klatek danych audio oraz flagę wskazującą, czy jest więcej klatek do odtworzenia / nagrania.
Rozpocznij przetwarzanie strumienia audio za pomocą pyaudio.Stream.start_stream () (4), który będzie wywoływał funkcję zwrotną wielokrotnie, dopóki funkcja nie zwróci pyaudio.paComplete .
Aby utrzymać strumień aktywny, główny wątek nie może się kończyć, np. Przez uśpienie (5).
Tryb blokowania Audio I / O
„” „PyAudio Przykład: Odtwórz plik wave.” „”
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()
Aby użyć PyAudio, najpierw utwórz PyAudio za pomocą pyaudio.PyAudio () (1), który konfiguruje system portaudio.
Aby nagrać lub odtworzyć dźwięk, otwórz strumień na żądanym urządzeniu z pożądanymi parametrami audio za pomocą pyaudio.PyAudio.open () (2). Spowoduje to skonfigurowanie pyaudio.Stream do odtwarzania lub nagrywania dźwięku.
Odtwarzaj dźwięk, zapisując dane audio w strumieniu za pomocą pyaudio.Stream.write () lub odczytaj dane audio ze strumienia za pomocą pyaudio.Stream.read () . (3)
Zauważ, że w „ trybie blokowania ” każdy blok pyaudio.Stream.write () lub pyaudio.Stream.read (), dopóki wszystkie podane / żądane klatki nie zostaną odtworzone / nagrane. Alternatywnie, aby generować dane audio w locie lub natychmiast przetwarzać nagrane dane audio, użyj „trybu oddzwaniania” ( patrz przykład w trybie oddzwaniania )
Użyj pyaudio.Stream.stop_stream (), aby wstrzymać odtwarzanie / nagrywanie, oraz pyaudio.Stream.close (), aby zakończyć strumień. (4)
Na koniec zakończ sesję portaudio za pomocą pyaudio.PyAudio.terminate () (5)