Hallo! Meine erste Artikelserie befasst sich mit Methoden zum Komprimieren und Speichern von Bildern / Ton wie JPEG (Bild) und WAVE (Ton) und enthält Beispiele für Programme, die diese Formate (.jpg, .wav) in der Praxis verwenden. In diesem Teil werden wir WAVE betrachten.
Die Geschichte
WAVE (Waveform Audio File Format) ist ein Container-Dateiformat zum Speichern von Audio-Stream-Aufzeichnungen. Dieser Container wird normalerweise verwendet, um unkomprimierten Ton bei der Pulscodemodulation zu speichern. (Nach Wikipedia)
Es wurde 1991 zusammen mit RIFF von Microsoft und IBM (damals führende IT-Unternehmen) erfunden und veröffentlicht.
Dateistruktur
Die Datei hat einen Header-Teil, die Daten selbst, aber es gibt keine Fußzeile. Der Header wiegt insgesamt 44 Bytes.
Der Header enthält Einstellungen für die Anzahl der Bits im Sample, die Häufigkeit der Beschreibung, die Schalltiefe usw. Informationen, die für eine Soundkarte benötigt werden. (Alle numerischen Tabellenwerte müssen in Little-Endian-Reihenfolge geschrieben werden.)
WAVE Beispiel
Die vorherige Tabelle kann leicht in eine C-Struktur übersetzt werden, aber heute ist unsere Sprache Python. Mit der Welle ist es am einfachsten, einen Rauschgenerator zu verwenden. Für diese Aufgabe benötigen wir keine hohe Byte-Rate und Komprimierung.
Zunächst importieren wir die erforderlichen Module:
Als nächstes müssen wir alle erforderlichen Variablen aus der Tabelle entsprechend ihrer Größe erstellen. Die darin enthaltenen Variablenwerte hängen hier nur von numSamples (der Anzahl der Samples) ab. Je mehr es gibt, desto länger wird unser Lärm dauern.
numSamples = int(argv[1]) output_path = argv[2] chunkId = b'RIFF' Format = b'WAVE' subchunk1ID = b'fmt ' subchunk1Size = b'\x10\x00\x00\x00'
Es bleibt nur, sie in der erforderlichen Reihenfolge (wie in der Tabelle) zu schreiben:
with open(output_path, 'wb') as fh: fh.write(chunkId + chunkSize + Format + subchunk1ID + subchunk1Size + audioFormat + numChannels + sampleRate + byteRate + blockAlign + bitsPerSample + subchunk2ID + subchunk2Size + data)
Und so gemacht. Um das Skript zu verwenden, müssen wir die erforderlichen Befehlszeilenargumente hinzufügen:
python3 WAV.py [num of samples] [output]
Anzahl der Proben - Anzahl Proben
Ausgabe - Pfad zur Ausgabedatei
Hier ist ein Link zu einer Test-Audiodatei mit Rauschen, aber um Speicherplatz zu sparen, habe ich BPS auf 1b / s gesenkt und die Anzahl der Kanäle auf 1 gesenkt (mit einem unkomprimierten 32-Bit-Stereo-Audio-Stream mit 64 KBit / s haben wir 80 MB einer sauberen WAV-Datei und nur 10): https: / /instaud.io/3Dcy
Der gesamte Code (WAV.py) (der Code enthält viele doppelte Variablenwerte, dies ist nur eine Skizze):
from struct import pack
Zusammenfassung
Sie haben also etwas mehr über digitalen Sound und dessen Speicherung gelernt. In diesem Beitrag haben wir keine Komprimierung (audioFormat) verwendet, aber um jeden der beliebten Artikel zu überprüfen, benötigen Sie Artikel 10. Ich hoffe, Sie haben etwas Neues für sich gelernt und dies wird Ihnen bei zukünftigen Entwicklungen helfen.
Vielen Dank!
Quellen
WAV-Dateistruktur
WAV - Wikipedia