Auslesen einer Wave-Datei mittels Konsole

Kinect_Titel

Auf dieser Seite erzähle ich etwas über Wave-Dateien und wie man diese mit Hilfe einer Anwendung dekodieren bzw. erstellen kann. Mit diesem Wissen ist man anschließend in der Lage seine eigenen Wave-Files zu erstellen. Dies ist besonders nützlich, wenn man ein Mikrofon o.ä. auslesen will.

-> Was ist eine Wave-Datei?:

Die Wave-Datei ist ein von Microsoft und IBM entwickeltes Format um Audiodaten zu speichern. Diese Audiodaten werden unkomprimiert gespeichert, weswegen Wave-Dateien relativ groß sind.
Der Grundaufbau einer Wave-Datei sieht wie folgt aus:

Aufbau Wave
Quelle: ccrma.stanford.edu

Eine Wave-Datei besteht aus drei Datenpaketen, den sogenannten Chunks:

  • RIFF-Chunk 12 Byte
  • Fmt Chunk 24 Byte
  • Data Chunk 8 + n Byte

Die Chunks sind nochmals unterteilt in Blöcke mit einer Größe von 2 und 4 Byte:

Im ersten Chunk sind grundlegende Informationen zu der Datei gespeichert.
Der erste Block enthält  die ASCII Zeichen des Wortes RIFF und der zweite Block enthält die Größe der Wave-Datei abzüglich 8 Bytes für die ersten beiden Blöcke.
Im letzten Block sind die ASCII Zeichen des Wortes WAVE gespeichert. Sie stellen das Format dar.

Der zweite Chunk enthält die Informationen über die Aufnahme. Der erste Block beinhaltet die Buchstaben des Wortes fmt + ein Leerzeichen und der zweite Block beinhaltet die Größe des Chunks. Dieser Wert beträgt üblicherweise 16 (auch hier werden von den 24 Byte Gesamtgröße wieder 8 Byte wegen den ersten beiden Blöcken abgezogen).
Jetzt beginnt der Datenblock des Chunks. Dieser ist in sechs Teile unterteilt.
Der erste Teil beinhaltet das Audio Format. Hier steht der Wert 1. Sind andere Werte als 1 in diesem Block gespeichert, so wurden die Audiodaten komprimiert.
Im zweiten Teil stehen die Anzahl der Kanäle und der darauf folgende Block beinhaltet die Samplerate des Audiosignals.
Als nächstes ist die Byte Rate gespeichert. Die letzten beiden Teile geben die Bytes und die Bits pro Sample wieder.

Der letzte Chunk enthält die Audiodaten.
Er beginnt wieder mit einer ID, nur diesmal steht in dem ersten Block das Wort data um zu verdeutlichen das nun der Datenblock anfängt. Im nächsten Block steht die Größe des darauf folgenden Datenblocks. Danach folgen die Audioinformationen.

Mit diesem Wissen kann nun ein Programm geschrieben werden, dass alle notwendigen Informationen aus der Datei herausfiltert.

-> Das Programm:

Im ersten Schritt wird im Visual Studio ein neues Projekt angelegt. Da ich auf eine GUI etc. verzichten möchte (u.a. weil das Programm relativ einfach gehalten werden soll), habe ich mich für eine Konsolenanwendung entschieden.
Beim starten des Programms wird der User aufgefordert den Pfad der zu dekodierenden Wave-Datei einzugeben:

Bevor ich mit der Auswertung beginne prüfe ich ob die Datei vorhanden ist. Sollte die Datei nicht vorhanden sein (z.B. weil man sich verschrieben hat), wird man aufgefordert den Pfad neu einzugeben:

Durch diese While-Schleife umgehe ich Abstürze des Programms durch falsche Dateipfade.
Wenn die Datei vorhanden ist, lege ich ein mehrdimensionales Array für die Daten an (jedes Chunk bekommt seine eigene Dimension), definiere die Größe der Dimensionen und öffne einen neuen Filestream um die Datei auszulesen:

Das @ vor der Variable Pfad bedeutet nur, dass der String gelesen wird ohne das Steuerzeichen interpretiert werden. Wenn man z.B. einen Pfad eingibt wo sowas steht wie \n würde das sonst zu einem Fehler führen, da \n eine neue Zeile bedeutet!
Mit Hilfe des Aufrufes über using definiere ich einen Block (ähnlich einer Schleife) wo ich die Datei verwende. Am Ende des Blocks wird die Datei dann automatisch wieder geschlossen.
Innerhalb dieses Blocks lese ich dann die drei Chunks aus und speichere sie in den ihnen zugeteilten Dimensionen meines Arrays:

Nach dem Auslesen der Chunks lege ich die Arrays für die in den Chunks enthaltenen Daten an.
Anschließend kopiere ich die Daten aus den Chunks in die einzelnen Arrays:

Mit Hilfe eines in Visual Studio enthaltenen Objektes namens ASCIIEncoding() setze ich die Integerwerte nun richtig zusammen und dekodiere die Strings. Das Ergebnis wird dann in der Konsole ausgegeben.

Jetzt kann das Programm ausgeführt werden. Das ganze sieht dann etwa so aus:

Wave-Reader(1)

 

Dokumentation:

 

-> Zurück zu Kinect für Windows

2 thoughts on “Auslesen einer Wave-Datei mittels Konsole
  1. Hallo, lieber Audio-Freund! – Also ich bin der John aus Trier und schon seit meiner Gym-Zeit begeisterter Musikhörer-sammler-digitalist und anderes mehr, was eben dazugehört. – Nun, ich habe aus meinem Bekanntenkreis gehört, dass man eine wav-file auslesen kann, um herauszufinden, an welcher Stelle eben die lauteste Modulationsstelle liegt, mit welcher man dann genau den individuellen song aussteuern kann. Stimmt das? – Bislang habe ich mit Hilfe von Lichtbandbreiten und einer selbst entwickelten Technik `recorded´, aber dies dauert immer sehr sehr lange. – Die Musik gibt mir sehr sehr viel und daher wäre ich sogar bereit etwas dafür zu entlohnen, ein solches Programm erhalten zu dürfen. – Abgesehen davon arbeite ich gleichsam mit einer ganz individuell erstellten einzigartigen Musikdatenbank, die ihresgleichen auch im gewaltigen Netz suchen aber nie finden würde, weil sie ganz einfach von langer Hand und Überlegung mit viel Liebe zum Detail konzipiert wurde. – Das wäre wirklich sehr schön – ein stetes Gegenspiel – meine eigenen DaBk zusammen mit einem derartigen peak-searching-and-finding-program. – Wer weiss, vielleicht können Sie mir ja doch irgendwie weiterhelfen?!? – Dankeschön für eine etwaige remail – Musik zum Grusse – John

    • Hallo John,

      ja, in dem wav-File sind die Informationen jedes Audiokanals gespeichert. Demzufolge ist es auch möglich zu schauen wo die lauteste Stelle ist und/oder bestimmte Stellen in dem File zu verändern (z.B. einen einzelnen Kanal).
      Die wav-Datei speichert ja die „Rohinformationen“ einer Audioaufnahme – sie ist somit vergleichbar mit einer RAW-Aufnahme in der Fotografie. Da sämtliche aufgenommenen Informationen noch die Rohdaten sind, können sie beliebig bearbeitet werden.
      Hoffe das reicht als Antwort :)

      Gruß
      Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.