Heim

RIFF WAVE

Vorlage:Infobox Dateiformat/Wartung/magic fehltVorlage:Infobox Dateiformat/Wartung/standard fehltVorlage:Infobox Dateiformat/Wartung/website fehlt

Waveform
Dateiendung .wav
MIME-Type audio/wav
audio/wave
audio/x-wav
Entwickelt von Microsoft & IBM
Art Audiodatei
Erweitert von RIFF

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.

Neben den meist enthaltenen unkomprimierten sog. PCM-Rohdaten (eigentlich nur Bytes, die den digitalen Wert des Audiosignals darstellen) können auch komprimierte Audiodaten (z. B. ADPCM- oder auch MP3-komprimierte Signale) enthalten sein. 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 meist unkomprimierten digitalen Audiodaten auf Windows-basierten PC-Systemen dar.

Inhaltsverzeichnis

Einleitung

Audiodateien enthalten die digitalisierte Form eines akustischen Signals, also eine diskrete 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:

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 vom Hauptprozessor 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 niedrigstwertigste Byte (LSB) an der ersten Stelle steht.

Samples werden ineinander verschränkt 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.

Darstellung eines Stereosignals im WAV-Format. Die beiden Samples ch0 und ch1 repräsentieren zusammen jeweils ein Frame. Bei Monodaten ist einem Frame genau ein Sample zugeordnet.

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:

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:

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 und die Aufrundungsfunktion ist:

Der Data-Chunk beinhaltet die eigentlichen Audiodaten:

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.

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

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 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