Поиск…


Вступление

PyAudio обеспечивает привязки Python для PortAudio, кросс-платформенной библиотеки аудио ввода-вывода. С помощью PyAudio вы можете легко использовать Python для воспроизведения и записи звука на различных платформах. PyAudio вдохновлен:

1.pyPortAudio / fastaudio: привязки Python для API PortAudio v18.

2.tkSnack: кросс-платформенный звуковой инструментарий для Tcl / Tk и Python.

замечания

Примечание: stream_callback вызывается в отдельном потоке (из основного потока). Исключения, которые происходят в stream_callback, будут:
1 .print traceback на стандартной ошибке, чтобы помочь отладке,
2. Запишите исключение, которое нужно бросить (в какой-то момент) в основной поток, и
3. Верните paAbort в PortAudio, чтобы остановить поток.
Примечание. Не используйте функцию Stream.read () или Stream.write (), если вы используете неблокирующую операцию.
См. Подпись обратного вызова PortAudio для получения дополнительной информации:
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710

Режим обратного вызова Аудиовход

"""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>) подписи callback(<input_data>, <frame_count>, <time_info>, <status_flag>) и должна возвращать кортеж, содержащий фреймы frame_count аудиоданных, и флаг, указывающий, есть ли больше кадров для воспроизведения / записи.

Начните обработку аудиопотока с помощью pyaudio.Stream.start_stream () (4), который будет вызывать функцию обратного вызова повторно, пока эта функция не вернет pyaudio.paComplete .

Чтобы поддерживать поток, основной поток не должен заканчиваться, например, спящим (5).

Режим блокировки Audio 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.PyAudio () (1), который устанавливает систему portaudio.

Для записи или воспроизведения звука откройте поток на нужном устройстве с требуемыми параметрами звука, используя pyaudio.PyAudio.open () (2). Это создает pyaudio.Stream для воспроизведения или записи звука.

Воспроизведите аудио, записав аудиоданные в поток, используя pyaudio.Stream.write () , или прочитайте аудиоданные из потока, используя pyaudio.Stream.read () . (3)

Обратите внимание, что в режиме блокировки каждый pyaudio.Stream.write () или pyaudio.Stream.read () блокируется, пока все данные / запрошенные кадры не будут воспроизведены / записаны. В качестве альтернативы для генерации аудиоданных «на лету» или непосредственного обработки записанных аудиоданных используйте «режим обратного вызова» ( см. Пример в режиме обратного вызова )

Используйте pyaudio.Stream.stop_stream (), чтобы приостановить воспроизведение / запись, и pyaudio.Stream.close (), чтобы завершить поток. (4)

Наконец, завершите сеанс portaudio, используя pyaudio.PyAudio.terminate () (5)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow