Was sind chunks, Muster und Rahmen bei Verwendung von pyaudio
Nachdem sich durch die Dokumentation der pyaudio und Lesen einige andere Artikel auf dem web, ich bin verwirrt, wenn mein Verständnis richtig ist.
Dies ist der code für die audio-Aufnahme finden Sie auf pyaudio Website:
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 dann bin ich in der Lage zu spielen, was ich aufgezeichnet:
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 Proben pro Sekunde.
- "CHUNK" ist die Anzahl der Bilder in den Puffer.
- Jedem frame werden 2 Proben als "CHANNELS=2".
- Größe jeder Probe wird 2 bytes, berechnet die Funktion:
pyaudio.get_sample_size(pyaudio.paInt16)
. - Daher die Größe der einzelnen Rahmen aus 4 bytes.
- In den "frames" - Liste, die Größe der einzelnen Elemente muss 1024*4 bytes, zum Beispiel, die Größe der
frames[0]
werden müssen, 4096 bytes. Allerdings
sys.getsizeof(frames[0])
zurück4133
, aberlen(frames[0])
zurück4096
. for
Schleifeint(RATE /CHUNK * RECORD_SECONDS)
mal, ich kann nicht verstehen, warum. Hier ist die gleiche Frage beantwortet, die von "Ruben Sanchez", aber ich kann nicht sicher sein, wenn es richtig ist, wie er sagtCHUNK=bytes
. Und nach seiner Erklärung, es mussint(RATE /(CHUNK*2) * RECORD_SECONDS)
als(CHUNK*2)
ist die Anzahl der Proben, Lesen Sie in einem Puffer mit jeder iteration.- Schließlich, wenn ich schreiben
print frames[0]
es druckt Kauderwelsch, wie es versucht zu behandeln-string, der ASCII-kodierten was es nicht ist, es ist nur ein Strom von bytes. So wie Drucke ich diesen stream von bytes in hexadezimal mitstruct
Modul? Und wenn ich später ändern Sie den hexadezimal-Wert mit Werte meine Wahl, wird es noch eine spielbare Ton?
Was ich oben schrieb, war mein Verständnis der Dinge, und viele von Ihnen vielleicht falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sys.getsizeof()
Berichte der Speicherplatz benötigt der Python-interpreter, der in der Regel ein bisschen mehr als die tatsächliche Größe der raw-Daten.RATE * RECORD_SECONDS
ist die Anzahl der frames, die aufgenommen werden sollten. Da diefor
- Schleife wird nicht wiederholt für jedes Rahmen aber nur für jeden chunk, die Anzahl der Durchläufe aufgeteilt werden, die von der chunk-GrößeCHUNK
. Das hat nichts zu tun mit Proben, so gibt es keinen Faktor2
beteiligt.[hex(x) for x in frames[0]]
. Wenn Sie wollen, um die tatsächlichen 2-byte-zahlen, verwenden Sie den format-string'<H'
mit derstruct
Modul.Du vielleicht Interesse in meinem tutorial über das Lesen von WAV-Dateien mit der
wave
- Modul, das deckt einige Ihrer Fragen im einzelnen: http://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-wave.ipynbpaNonInterleaved
verwendet separate Zeiger für jeden Kanal, also die gesamte audio-Daten nicht unbedingt in einer einzigen zusammenhängenden block im Speicher.