WAV (Format)
aus Wikipedia, der freien Enzyklopädie
Das WAV-Dateiformat ist ein Containerformat zur digitalen Speicherung von Audiodaten, das neben den meist enthaltenen unkomprimierten sog. PCM-Rohdaten (eigentlich nur Bytes, die den digitalen Wert des Audiosignals darstellen) auch komprimierte Audiodaten (z. B. ADPCM- oder auch MP3-komprimierte Signale) enthalten kann. Im Falle von PCM unterstützt es variable Quantisierungsbitraten, Abtastraten und Kanäle. Es stellt heute einen De-Facto-Standard für die Speicherung von digitalen Audiodaten auf MS Windows-basierten PC-Systemen dar.
Das WAV-Format (eigentlich RIFF WAVE) hält sich an das von Microsoft für das Betriebssystem Windows definierte "Resource Interchange File Format" (RIFF).
Inhaltsverzeichnis |
[Bearbeiten] Einleitung
Audiodateien enthalten die digitalisierte Form eines akustischen Signals, also eine diskrete Darstellung des zeitlichen Verlaufs einer Schwingung. Es wird zu bestimmten Zeitpunkten die Auslenkung (Elongation) einer Schwingung festgehalten.
Die Qualität des aufgezeichneten Klangs hängt vor allem von zwei Werten ab:
- Der Abtastrate (Wie oft wird das Signal abgetastet?)
- Der Anzahl der Bits pro Sample (Quantisierungsrate der Amplitude, auch "Bittiefe" genannt)
[Bearbeiten] Samples & Frames
"Sample" ist die englische Bezeichnung für einen Abtastwert, der im Zuge einer Analog-Digital-Wandlung ermittelt wird. Bei Multikanaldaten gibt es pro Kanal einen entsprechenden Abtastwert. Jeder Abtastwert pro Zeiteinheit ist in einem Frame zusammengefasst. Die Amplitude wird als Serie von aufeinanderfolgenden Blöcken zu je 8 Bit im Zweierkomplement abgebildet, da sie so von der CPU schneller verarbeitet und auch aus dem bzw. in den Speicher schneller gelesen bzw. geschrieben werden können. Bei Quantisierungsraten, die nicht durch 8 teilbar sind, werden die restlichen Bits bis zum nächsten durch 8 ganzzahlig teilbaren Wert mit Nullen aufgefüllt (Zero-Padding). Die Datenbits sollten linksbündig angeordnet sein, d. h. beispielsweise bei einem 12-Bit-Signal sind die Bits 0-3 "0" und 4-15 für die eigentlichen Sampledaten reserviert. Das WAV-Format verwendet die Little-Endian-Anordnung als Standard, wo das Least Significant Bit (LSB) an der ersten Stelle steht.
8-Bit-Daten sind als unsigned char
definiert (Wertebereich 0 bis 255), 16-Bit-Daten als signed short
(Wertebereich -32768 bis 32767). Diese Inkonsistenz zwischen signed
und unsigned
ist ein Nachteil des WAV-Formats.
Samples werden ineinander (engl. "interleaved") gespeichert. Das bedeutet, dass für jeden Kanal pro Zeiteinheit das entsprechende Sample aufeinanderfolgend positioniert wird. Dies ist sinnvoll, weil eine Wiedergabe von non-interleaved-Daten (zuerst Kanal 0 von allen Frames, dann Kanal 1, usw.) in Echtzeit sonst erschwert wäre.
[Bearbeiten] Dateistruktur
Die Struktur des WAV-Formats besteht aus einer Sequenz von Datenpaketen (Chunks), die größtenteils optional sind. Im Laufe der Entwicklung kam es zu einer unüberschaubaren Anzahl von Chunks mit teils redundanten und überschneidenden Inhalten. Die unkoordinierte Arbeitsweise von Programmierern aus aller Welt führte zu einem "unsauberen" Dateiformat. Ein Beispiel ist der Label-Chunk und Note-Chunk, die beide Cuepoint-Einträge im Cue-Chunk mit einer Beschriftung versehen. Dabei bezeichnet ein "Label" den Titel eines Cuepoints, "Note" einen Kommentar. Sie sind als Sub-Chunks im übergeordneten Associated-Data-List-Chunk gespeichert. Des weiteren gibt es eine Vielzahl von Kompressionsarten, die jeweils ihren eigenen Chunk definieren.
Die WAV-Spezifikation definiert drei Chunks als verpflichtend:
- Der RIFF-Chunk identifiziert die Datei als WAV-Datei.
- Der FORMAT-Chunk hat einige Parameter wie z. B. die Sample-Rate gespeichert.
- Der DATA-Chunk enthält die tatsächlichen Audiodaten.
Die Datei muss mit dem "RIFF WAVE"-Chunk beginnen, bestehend aus der groupID
"RIFF" und der riffType
"WAVE". Unmittelbar darauf muss der Format-Chunk folgen. Er muss und darf in der Datei nur einmal vorkommen. In diesem Chunk befinden sich die wichtigsten Parameter, die das WAV-Signal charakterisieren. Der Format-Chunk setzt sich aus folgenden Elementen zusammen:
chunkID
(int
)chunkSize
(long
)wFormatTag
(short
)wChannels
(unsigned short
)dwSamplesPerSec
(unsigned long
)dwAvgBytesPerSec
(unsigned long
)wBlockAlign
(unsigned short
)wBitsPerSample
(unsigned short
)
Die chunkID
ist immer "fmt ", gefolgt von der Größe des Chunks chunkSize
. Die Variable wFormatTag
beschreibt, falls vorhanden, die Kompressionsart der Daten mit einem Wert ungleich 1. In diesem Fall werden weitere Felder im Format-Chunk eingefügt, beginnend nach wFormatTag
mit einer Größenangabe der zusätzlichen Bytes als unsigned short
. Danach folgt ein Fact-Chunk, der in einem unsigned long
Auskunft über die Größe der unkomprimierten Daten gibt. Die Audiodaten können auf mehrere Arten komprimiert werden, was eine vollständige Unterstützung des WAV-Formats für Entwickler noch schwieriger macht. Wird keine Kompression verwendet, hat wFormatTag
den Wert 1. wChannels
beschreibt die Anzahl der Kanäle. Bei Monosignalen ist dieser Wert gleich 1, Stereosignalen gleich 2, usw. Es kann eine beliebige Anzahl von Kanälen verwendet werden. Für Multikanaldaten wird jedes Sample pro Kanal zusammen in einem Sample-Frame zusammengefasst. dwSamplesPerSec
steht für die Anzahl der Samples pro Sekunde, also der Abtastrate in Hertz (Hz). dwAvgBytesPerSec
bezeichnet die durchschnittliche Anzahl von Datenbytes pro Sekunde. Sie entspricht dem Produkt aus Abtastrate und Framegröße:
Die Framegröße wBlockAlign setzt sich wie folgt zusammen, wobei wBitsPerSample
die Quantisierungsrate in Bit ist:
Der Data-Chunk beinhaltet die eigentlichen Audiodaten:
chunkID
(int
)chunkSize
(long
)waveformData
(unsigned char*
)
Die chunkID
ist immer "data", gefolgt von der Größe des Chunks chunkSize
. Die Bytes jedes Sampleframes sind anschließend als 8-Bit-Blöcke im Array waveformData
gespeichert. Audiodaten können auch ohne Header-Information gespeichert werden, sodass die Abtastrate, Bittiefe, etc. nicht definiert sind. Diese Daten müssen beim Öffnen der Datei bekannt sein und angegeben werden. Ebenso ist die Bitanordnung anzugeben, da sie im Unterschied zu WAV auch dem Big-Endian-Prinzip unterliegen kann. Die Datei (üblicherweise mit der Endung RAW) beinhaltet die rohen Audiodaten bestehend aus PCM-Samples.
[Bearbeiten] Berechnung der Größe einer Audiodatei im Datenformat PCM
Pro Sekunde fallen Abtastrate · Bytes pro Sample · Anzahl der Kanäle (mono = 1, stereo = 2) an Bytes an.
Beispiel: 5 Minuten = 300 Sekunden, CD-Qualität (16 Bit = 2 Byte, 44.100 Hertz, stereo)
[Bearbeiten] Beispiel eines allgemein lesbaren WAVE-Dateiformates
- übernommen von http://www.lightlink.com/tjweber/StripWav/Canon.html
Die hier beschriebenen Einträge sind in der Little-Endian Byte-Reihenfolge.
RIFF-Header:
Offset | Länge (in bytes) | Inhalt |
---|---|---|
0 | 4 | 'RIFF' |
4 | 4 | <Dateigröße - 8> |
8 | 4 | 'WAVE' |
Der fmt-chunk beschreibt das Sample-Format:
Offset | Länge (in bytes) | Inhalt | Beschreibung |
---|---|---|---|
12 | 4 | 'fmt ' | Header Signatur |
16 | 4 | <fmt length> | Länge des restlichen fmt-Headers (16 Byte) |
20 | 2 | <format tag> | sample Datenformat (siehe Tabelle weitere Formate) |
22 | 2 | <channels> | Anzahl der Kanäle: 1 = mono, 2 = stereo |
24 | 4 | <sample rate> | Abtastrate pro Sekunde (z.B. 44100) |
28 | 4 | <bytes/second> | Sample-Rate * Block-Align |
32 | 2 | <block align> | Kanäle * bits/sample / 8 |
34 | 2 | <bits/sample> | 8 oder 16 |
Der Daten-Chunk enthält die Sample-Daten:
Offset | Länge (in bytes) | Inhalt | Beschreibung |
---|---|---|---|
36 | 4 | 'data' | Header Signatur |
40 | 4 | <length> | Länge des Datenblocks |
44 | <bits/sample>/8 | Sample Data |
Sample Datenformate (Format Tag)
ID | Bezeichnung |
---|---|
0x0001 | PCM |
0x0002 | MS ADPCM |
0x0005 | IBM CVSD |
0x0006 | ALAW |
0x0007 | MULAW |
0x0010 | OKI ADPCM |
0x0011 | DVI/IMA ADPCM |
0x0012 | MEDIASPACE ADPCM |
0x0013 | SIERRA ADPCM |
0x0014 | G723 ADPCM |
0x0015 | DIGISTD |
0x0016 | DIGIFIX |
0x0017 | DIALOGIC OKI ADPCM |
0x0020 | YAMAHA ADPCM |
0x0021 | SONARC |
0x0022 | DSPGROUP TRUESPEECH |
0x0023 | ECHOSC1 |
0x0024 | AUDIOFILE AF36 |
0x0025 | APTX |
0x0026 | AUDIOFILE AF10 |
0x0030 | DOLBY AC2 |
0x0031 | GSM610 |
0x0033 | ANTEX ADPCME |
0x0034 | CONTROL RES VQLPC |
0x0035 | CONTROL RES VQLPC |
0x0036 | DIGIADPCM |
0x0037 | CONTROL RES CR10 |
0x0038 | NMS VBXADPCM |
0x0039 | CS IMAADPCM |
0x0040 | G721 ADPCM |
0x0050 | MPEG |
0x0200 | CREATIVE ADPCM |
0x0202 | CREATIVE FASTSPEECH8 |
0x0203 | CREATIVE FASTSPEECH10 |
0x0300 | FM TOWNS SND |
0x1000 | OLIGSM |
0x1001 | OLIADPCM |
0x1002 | OLICELP |
0x1003 | OLISBC |
0x1004 | OLIOPR |
[Bearbeiten] Literatur
- Born, Günter, Referenzhandbuch Dateiformate. 1990, Addison Wesley Longman, in div. Überarbeiteten Auflagen
- Born, Gunter: File Formats Handbook. 1995, ITP Boston
[Bearbeiten] Links
- http://www.kgw.tu-berlin.de/KW/Studio/ProTools/audio-formate/wav/index.html
- http://www.it.fht-esslingen.de/~schmidt/vorlesungen/mm/seminar/ss00/HTML/node107.html (sehr ausführliche Beschreibung)
- http://www.fh-friedberg.de/fachbereiche/e2/telekom-labor/zinke/nw/vp/doku/dito41.htm
- The WAVE File Format von tjw
- Ausführliche Beschreibungen aller Arten von Dateiformaten
- Audioprogrammierung unter Windows mit C++ für Computerspiele
- WAVE PCM soundfile format