Python Language
pyaudio
Buscar..
Introducción
PyAudio proporciona enlaces de Python para PortAudio, la biblioteca de E / S de audio multiplataforma. Con PyAudio, puede usar Python fácilmente para reproducir y grabar audio en una variedad de plataformas. PyAudio está inspirado en:
1.pyPortAudio / fastaudio: enlaces de Python para la API de PortAudio v18.
2.tkSnack: kit de herramientas de sonido multiplataforma para Tcl / Tk y Python.
Observaciones
Nota: se llama a stream_callback en un hilo separado (del hilo principal). Las excepciones que se producen en el stream_callback:
1. Imprima un rastreo de error estándar para ayudar a la depuración,
2 .queue la excepción que se lanzará (en algún momento) en el hilo principal, y
3. Devuelva paAbort a PortAudio para detener la transmisión.
Nota: No llame a Stream.read () ni a Stream.write () si usa una operación sin bloqueo.
Ver: firma de devolución de llamada de PortAudio para detalles adicionales:
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710
Modo de devolución de llamada de 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()
En el modo de devolución de llamada, PyAudio llamará a una función de devolución de llamada especificada (2) siempre que necesite nuevos datos de audio (para reproducir) y / o cuando haya nuevos datos de audio (grabados) disponibles. Tenga en cuenta que PyAudio llama a la función de devolución de llamada en un hilo separado. La función tiene la siguiente callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
firma callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
y debe devolver una tupla que contiene fotogramas frame_count
de datos de audio y una bandera que indica si hay más frames para reproducir / grabar.
Comience a procesar la transmisión de audio utilizando pyaudio.Stream.start_stream () (4), que llamará repetidamente a la función de devolución de llamada hasta que esa función devuelva pyaudio.paComplete .
Para mantener el flujo activo, el hilo principal no debe terminar, por ejemplo, durmiendo (5).
Modo de bloqueo de E / S de audio
"" "Ejemplo de PyAudio: reproducir un archivo 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()
Para usar PyAudio, primero cree una instancia de PyAudio usando pyaudio.PyAudio () (1), que configura el sistema portaudio.
Para grabar o reproducir audio, abra una transmisión en el dispositivo deseado con los parámetros de audio deseados utilizando pyaudio.PyAudio.open () (2). Esto configura un pyaudio.Stream para reproducir o grabar audio.
Reproduce el audio escribiendo datos de audio en la transmisión usando pyaudio.Stream.write () , o lee los datos de audio de la transmisión usando pyaudio.Stream.read () . (3)
Tenga en cuenta que en el " modo de bloqueo ", cada pyaudio.Stream.write () o pyaudio.Stream.read () se bloquea hasta que todos los cuadros dados / solicitados se hayan reproducido / grabado. Alternativamente, para generar datos de audio sobre la marcha o procesar inmediatamente los datos de audio grabados, use el "modo de devolución de llamada" ( consulte el ejemplo en el modo de devolución de llamada )
Use pyaudio.Stream.stop_stream () para pausar la reproducción / grabación, y pyaudio.Stream.close () para terminar la transmisión. (4)
Finalmente, finalice la sesión de portaudio utilizando pyaudio.PyAudio.terminate () (5)