Что такое куски, образцы и кадры при использовании pyaudio
Пройдя документацию по pyaudio и прочитав некоторые другие статьи в Интернете, я не понимаю, правильно ли я понимаю.
Вот код для аудиозаписи, найденный на сайте pyaudio:
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
и если я добавлю эти строки, я смогу воспроизвести все, что записал:
play=pyaudio.PyAudio()
stream_play=play.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True)
for data in frames:
stream_play.write(data)
stream_play.stop_stream()
stream_play.close()
play.terminate()
«СКОРОСТЬ» - это количество выборок в секунду.«CHUNK» - это количество кадров в буфере.Каждый кадр будет иметь 2 сэмпла как «CHANNELS = 2».Размер каждой выборки составляет 2 байта, рассчитывается с помощью функции:pyaudio.get_sample_size(pyaudio.paInt16)
.Поэтому размер каждого кадра составляет 4 байта.В списке «frames» размер каждого элемента должен быть 1024 * 4 байта, например, размерframes[0]
должно быть 4096 байт. Тем не мение,sys.getsizeof(frames[0])
возвращается4133
, ноlen(frames[0])
возвращается4096
.for
цикл выполняетсяint(RATE / CHUNK * RECORD_SECONDS)
раз я не могу понять, почему.Вот на тот же вопрос ответил "Рубен Санчес", но я не уверен, правильно ли он говоритCHUNK=bytes
, И согласно его объяснению, это должно бытьint(RATE / (CHUNK*2) * RECORD_SECONDS)
как(CHUNK*2)
количество выборок, прочитанных в буфере за каждую итерациюНаконец, когда я пишуprint frames[0]
, он печатает тарабарщину, пытаясь обработать строку в кодировке ASCII, а это не просто поток байтов. Итак, как мне распечатать этот поток байтов в шестнадцатеричном формате, используяstruct
модуль? И если позже я заменим каждое шестнадцатеричное значение на значения по своему выбору, будет ли оно воспроизводить воспроизводимый звук?Все, что я написал выше, было моим пониманием вещей, и многие из них, возможно, ошибались.