Python Language
pyaudio
Поиск…
Вступление
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)