Python Language
pyaudio
Ricerca…
introduzione
PyAudio fornisce collegamenti Python per PortAudio, la libreria I / O audio multipiattaforma. Con PyAudio, puoi facilmente usare Python per riprodurre e registrare l'audio su una varietà di piattaforme. PyAudio è ispirato da:
1.pyPortAudio / fastaudio: collegamenti Python per l'API PortAudio v18.
2.tkSnack: toolkit audio cross-platform per Tcl / Tk e Python.
Osservazioni
Nota: stream_callback è chiamato in un thread separato (dal thread principale). Le eccezioni che si verificano nello stream_callback:
1 .stampare un traceback sull'errore standard per facilitare il debug,
2 .queue l'eccezione da lanciare (ad un certo punto) nel thread principale, e
3 .return paAbort su PortAudio per interrompere lo streaming.
Nota: non chiamare Stream.read () o Stream.write () se si utilizza l'operazione non bloccante.
Vedi: Firma callback di PortAudio per ulteriori dettagli:
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710
Modalità di callback 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()
In modalità callback, PyAudio chiamerà una funzione di callback specificata (2) ogni volta che ha bisogno di nuovi dati audio (da riprodurre) e / o quando sono disponibili nuovi dati audio (registrati). Si noti che PyAudio chiama la funzione di callback in un thread separato. La funzione ha il seguente callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
firma callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
e deve restituire una tupla contenente frame_count
frame di dati audio e un flag che indica se ci sono più frame da riprodurre / registrare.
Inizia l'elaborazione del flusso audio usando pyaudio.Stream.start_stream () (4), che chiamerà ripetutamente la funzione di callback fino a quando quella funzione non restituirà pyaudio.paComplete .
Per mantenere attivo il flusso, il thread principale non deve terminare, ad es. Dormendo (5).
Modalità I / O audio blocco
"" "Esempio di PyAudio: riproduzione di un file 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()
Per usare PyAudio, prima istanzia PyAudio usando pyaudio.PyAudio () (1), che configura il sistema portaudio.
Per registrare o riprodurre audio, apri uno stream sul dispositivo desiderato con i parametri audio desiderati usando pyaudio.PyAudio.open () (2). Questo imposta un pyaudio.Stream per riprodurre o registrare l'audio.
Riproduci l'audio scrivendo i dati audio nello stream utilizzando pyaudio.Stream.write () o leggi i dati audio dallo stream utilizzando pyaudio.Stream.read () . (3)
Nota che in " modalità di blocco ", ogni blocco pyaudio.Stream.write () o pyaudio.Stream.read () si blocca fino a quando tutti i fotogrammi dati / richiesti sono stati riprodotti / registrati. In alternativa, per generare dati audio al volo o elaborare immediatamente i dati audio registrati, utilizzare la "modalità di richiamata" ( fare riferimento all'esempio sulla modalità di richiamata )
Utilizzare pyaudio.Stream.stop_stream () per sospendere la riproduzione / registrazione e pyaudio.Stream.close () per terminare lo streaming. (4)
Infine, termina la sessione portaudio usando pyaudio.PyAudio.terminate () (5)