¿Qué son fragmentos, muestras y marcos cuando se usa pyaudio?

Después de revisar la documentación de pyaudio y leer algunos otros artículos en la web, estoy confundido si mi comprensión es correcta.

Este es el código para la grabación de audio que se encuentra en el sitio de 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()

y si agrego estas líneas, puedo reproducir lo que haya grabado:

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()
"RATE" es el número de muestras recolectadas por segundo."CHUNK" es el número de cuadros en el búfer.Cada cuadro tendrá 2 muestras como "CANALES = 2".El tamaño de cada muestra es de 2 bytes, calculado utilizando la función:pyaudio.get_sample_size(pyaudio.paInt16).Por lo tanto, el tamaño de cada trama es de 4 bytes.En la lista de "marcos", el tamaño de cada elemento debe ser 1024 * 4 bytes, por ejemplo, el tamaño deframes[0] debe tener 4096 bytes. Sin embargo,sys.getsizeof(frames[0]) devoluciones4133, perolen(frames[0]) devoluciones4096.for el bucle se ejecutaint(RATE / CHUNK * RECORD_SECONDS) veces, no puedo entender por qué.aquí es la misma pregunta respondida por "Ruben Sanchez" pero no puedo estar seguro si es correcta como él diceCHUNK=bytes. Y según su explicación, debe serint(RATE / (CHUNK*2) * RECORD_SECONDS) como(CHUNK*2) es el número de muestras leídas en el búfer con cada iteración.Finalmente cuando escriboprint frames[0], imprime galimatías cuando intenta tratar la cadena para que se codifique ASCII, lo que no es, es solo una secuencia de bytes. Entonces, ¿cómo imprimo este flujo de bytes en hexadecimal usandostruct ¿módulo? Y si más tarde, cambio cada uno de los valores hexadecimales con los valores de mi elección, ¿seguirá produciendo un sonido reproducible?

Lo que escribí arriba fue mi comprensión de las cosas y muchas de ellas tal vez estaban equivocadas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta