RIFF WAVE
RIFF WAVE | |
---|---|
Dateiendung: | keine |
Fehler bei Vorlage * Parametername unbekannt (Vorlage:Infobox Dateiformat): "extended to; contained by; uniform type; standard; owner; type code; genre; name; container for; extended from; mime; icon; extension" |
Das WAVE-Dateiformat ist ein Containerformat zur digitalen Speicherung von Audiodaten, das auf dem Resource Interchange File Format (RIFF) aufsetzt, das von Microsoft für das Betriebssystem Windows definiert wurde.
Enthalten sind meist sog. PCM-Rohdaten, die Abtastwerte des Audiosignals unkomprimiert digital darstellen, oder komprimierte Audiodaten, z. B. ADPCM oder MP3. Im Falle von PCM unterstützt es verschiedene Quantisierungsauflösungen, Abtastraten und Kanalzahlen. Es stellt heute einen De-facto-Standard für die Speicherung von Audiodaten unter Windows dar.
Einleitung
Audiodateien enthalten die digitalisierte Form eines akustischen Signals, also eine zeit- und wertdiskrete Darstellung des zeitlichen Verlaufs einer Schwingung. Bei der Analog-Digital-Umsetzung wird zu bestimmten Zeitpunkten die Auslenkung (Elongation) einer Schwingung festgehalten.
Die Qualität des aufgezeichneten Klangs hängt vor allem von zwei Werten ab:
- Abtastrate (Anzahl der Abtastungen pro Zeiteinheit),
- Quantisierungsrate (auch „Bittiefe“ genannt).
Samples & Frames

„Sample“ ist die englische Bezeichnung für einen charakterisierenden Teil einer Gesamtheit. Hier geht es um einzelne Abtastwerte, die durch Analog-Digital-Wandlung ermittelt werden. Bei Multikanaldaten gibt es pro Zeitpunkt mehrere „Sample Points“, die zu einem „Sample Frame“ zusammengefasst sind, zuerst Kanal 0 (mono oder linker Stereokanal), dann Kanal 1 usw.
Dateistruktur

Das RIFF-Format besteht aus Datenpaketen (Chunks), die wie beim IFF aufgebaut sind, bis auf die Byte-Reihenfolge: niederwertiges Byte (LSB) voran. Die WAVE-Spezifikation definiert drei Chunks als verpflichtend: Der RIFF-Chunk identifiziert die Datei als .wav-Datei und enthält als Container die anderen Chunks. Der FORMAT-Chunk enthält Parameter wie z. B. die Abtastrate. Der DATA-Chunk enthält den Signalverlauf.
Im Laufe der unkoordinierten Entwicklung kam es zu einer unüberschaubaren Anzahl weiterer Chunk-Typen mit teils redundanten Inhalten. 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 komprimierten Formaten, für die ein Fact-Chunk mit der dekomprimierten Größe verbindlich ist, die aber ansonsten unterschiedlichste Parameter definieren, was eine vollständige Unterstützung des WAV-Formats für Entwickler noch schwieriger macht.
RIFF-Chunk (auch „RIFF WAVE“-Chunk)
Er enthält als Container die anderen Chunks, sein Header besteht lediglich aus
chunkID
(Char[4]
, "RIFF")ChunkSize
(unsigned long
, = Dateilänge in Bytes - 8)riffType
(Char[4]
, "WAVE")
Format-Chunk
Er beginnt mit der Kennung "fmt " und muss in der Datei genau einmal, und zwar als erster Sub-Chunk, enthalten sein. Auf seine ChunkSize
folgt der Inhalt, der aus einem Satz allgemeiner Parameter und einem nachfolgenden formatspezifischen Teil besteht. Der allgemeine Teil:
wFormatTag
(0x0001 steht für PCM, das kanonische, unkomprimierte Format)wChannels
(unsigned short
, 1 für Mono, 2 für Stereo, mehr ist möglich)dwSamplesPerSec
(unsigned long
, Abtastrate in Hz)dwAvgBytesPerSec
(unsigned long
, nötige Übertragungsbandbreite)wBlockAlign
(unsigned short
, Größe der Frames in Bytes)
Für PCM-Daten hat der Format-Chunk nur noch dieses eine Feld:
wBitsPerSample
(unsigned short
, Quantisierungsauflösung, identisch für alle Kanäle)
Wird keine Kompression verwendet, ist dwAvgBytesPerSec
das Produkt aus Abtastrate und Framegröße.
Die Framegröße ergibt sich aus der Vorgabe, dass alle Werte im Daten-Chunk als Integer zu kodieren sind mit einer gerade ausreichenden Größe in Byte (evtl nötige Pad-Bits stehen am niederwertigen Ende mit dem Wert 0). Für das PCM-Format gilt
wBlockAlign = wChannels * ((wBitsPerSample + 7) / 8)
(Integer-Division ohne Rest),
sodass die Framegröße für 12-Bit-Stereo nicht drei sondern vier Byte beträgt.
Data-Chunk
Er hat die Kennung "data". Seine chunkSize
enthält (wie bei allen Chunks) weder die 8 Bytes von Kennung und Größe noch das am Ende zur vorgeschriebenen Ausrichtung auf Wortgrenzen evtl. nötige Null-Byte. Sein Inhalt ist eine Folge von Frames, deren Aufbau im Folgenden lediglich für das PCM-Format angegeben wird.
Sample-Werte sind für Bittiefen bis 8 als unsigned char
kodiert, sonst signed int
. Bei Bit-Tiefen, die nicht durch 8 teilbar sind, wird das erste Byte (LSB) rechts mit Nullen aufgefüllt (Zero-Padding). Das ergibt beispielsweise für den größten positiven 12-Bit-Wert die Bytefolge „0xF0 0x7F“. Bei zwei Kanälen (Stereo) wird erst der linke, dann der rechte Kanal gespeichert.
Dieses Format, ohne Header gespeichert, hat üblicherweise die Endung *.raw und setzt bei der Wiedergabe die Kenntnis von Abtastrate, Bittiefe und Byte-Reihenfolge voraus (letztere ist nur unter RIFF festgelegt, nicht für rohes PCM).
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)
Beispiel eines allgemein lesbaren WAVE-Dateiformates
- übernommen von http://www.lightlink.com/tjweber/StripWav/Canon.html
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 separate Tabelle weiter unten) |
22 | 2 | <channels> | Anzahl der Kanäle: 1 = mono, 2 = stereo; Mittlerweile sind auch mehr als 2 Kanäle, für surround sound, möglich. ergänzt von [1] |
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, 16 oder 24 |
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 |
0x0003 | IEEE FLOAT |
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 |
0x0069 | Xbox ADPCM |
0x0200 | CREATIVE ADPCM |
0x0202 | CREATIVE FASTSPEECH8 |
0x0203 | CREATIVE FASTSPEECH10 |
0x0300 | FM TOWNS SND |
0x1000 | OLIGSM |
0x1001 | OLIADPCM |
0x1002 | OLICELP |
0x1003 | OLISBC |
0x1004 | OLIOPR |
Literatur
- Born, Günter, Referenzhandbuch Dateiformate. 1990, Addison Wesley Longman, in diversen überarbeiteten Auflagen
- Born, Gunter: File Formats Handbook. 1995, ITP Boston
Weblinks
- http://www.it.fht-esslingen.de/~schmidt/vorlesungen/mm/seminar/ss00/HTML/node107.html (ausführliche Beschreibung)
- http://www.piclist.com/techref/io/serial/midi/wave.html (ausführlicher, engl.)
- http://www.saettler.com/RIFFMCI/riffmci.html (Version 1.0 der Spezifikation, engl.)
- http://www.fh-friedberg.de/fachbereiche/e2/telekom-labor/zinke/nw/vp/doku/dito41.htm (knapp, übersichtlich)
- The WAVE File Format von tjw
- ausführliche Beschreibungen vieler Dateiformate
- WAVE PCM soundfile format