Was sind Chunks, Samples und Frames bei der Verwendung von pyaudio
Nachdem ich die Dokumentation von pyaudio durchgesehen und einige andere Artikel im Web gelesen habe, bin ich verwirrt, ob mein Verständnis korrekt ist.
Dies ist der Code für Audioaufnahmen, der auf der Website von pyaudio zu finden ist:
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()
und wenn ich diese Zeilen hinzufüge, kann ich alles abspielen, was ich aufgenommen habe:
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" ist die Anzahl der pro Sekunde gesammelten Proben. "CHUNK" ist die Anzahl der Frames im Puffer.Jeder Frame hat 2 Samples als "CHANNELS = 2". Die Größe jedes Samples beträgt 2 Bytes, berechnet mit der Funktion:pyaudio.get_sample_size(pyaudio.paInt16)
.Daher beträgt die Größe jedes Frames 4 Bytes.In der "Frames" -Liste muss die Größe jedes Elements 1024 * 4 Bytes betragen, z. B. die Größe vonframes[0]
muss 4096 Bytes sein. Jedoch,sys.getsizeof(frames[0])
kehrt zurück4133
, aberlen(frames[0])
kehrt zurück4096
.for
Schleife führt @ aint(RATE / CHUNK * RECORD_SECONDS)
Mal kann ich nicht verstehen, warum.Hie ist die gleiche Frage von "Ruben Sanchez" beantwortet, aber ich kann nicht sicher sein, ob es korrekt ist, wie er sagtCHUNK=bytes
. Und nach seiner Erklärung muss es seinint(RATE / (CHUNK*2) * RECORD_SECONDS)
wie(CHUNK*2)
ist die Anzahl der Abtastwerte, die bei jeder Iteration im Puffer gelesen wurden.ndlich, wenn ich schreiprint frames[0]
, es gibt Kauderwelsch aus, wenn versucht wird, die zu codierende Zeichenfolge als ASCII-Zeichenfolge zu behandeln. Wie kann ich diesen Bytestrom mit @ hexadezimal ausgebestruct
Modul? Und wenn ich später jeden Hexadezimalwert mit Werten meiner Wahl ändere, wird dann trotzdem ein abspielbarer Sound erzeugt?Was auch immer ich oben schrieb, war mein Verständnis der Dinge und viele von ihnen vielleicht falsch.