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)



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow