Frage

Ich bin ein eine Anwendung in C # zu schreiben, die Audio-Dateien aufnehmen wird (* .wav) und automatisch Tag und benennen Sie diese. Wave-Dateien sind RIFF-Dateien (wie AVI), die Meta-Datenblöcke zusätzlich zu den Wellenformdatenblöcke enthalten kann. So, jetzt ich versuche, herauszufinden, wie die RIFF Meta-Daten zu und von aufgezeichneten Wave-Dateien zu lesen und schreiben.

Ich verwende NAudio für die Dateien der Aufnahme und fragte auf ihren Foren als gut auf sO Art und Weise und zu schreiben RIFF-Tags zu lesen. Während ich eine Reihe von guten Antworten erhalten haben, keine der Lösungen für das Lesen von und Schreiben RIFF Brocken so leicht wie ich möchte erlaubt.

Aber noch wichtiger Ich habe sehr wenig Erfahrung im Umgang mit Dateien auf Byte-Ebene, und denke, das ist eine gute Gelegenheit sein könnte, zu lernen. So, jetzt will ich versuchen, meine eigene Klasse schreiben (n), die in einer RIFF-Datei lesen und erlauben Meta-Daten zu lesen, und aus der Datei geschrieben.

Ich habe Ströme in C # verwendet, aber immer mit dem gesamten Strom auf einmal. So, jetzt bin ich wenig verloren, dass ich eine Datei Byte für Byte zu betrachten haben. Insbesondere wie würde ich über das Entfernen oder Einfügen von Bytes zu und von der Mitte einer Datei gehen? Ich habe versucht, eine Datei durch einen Filestream in einen Byte-Array zu lesen (byte []), wie in dem Code angezeigt wird.

System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);

Und ich konnte das Visual Studio-Debugger sehen durch, dass die ersten vier Byte der RIFF Header der Datei sind. alt text

Aber Arrays sind ein Schmerz zu behandeln, wenn Aktionen auszuführen, die ihre Größe ändern, wie das Einfügen oder Werte zu entfernen. Ich konnte dann auf die byte [] in eine Liste wie diese, so dachte ich.

List<byte> list = waveBytes.ToList<byte>();

Welche jegliche Manipulation der Datei Byte für Byte eine ganze Reihe einfacher machen würde, aber ich mache mir Sorgen, ich könnte so etwas wie eine Klasse in der System.IO Namensraum fehlt, dass all dies noch einfacher machen würde. Bin ich auf dem richtigen Weg, oder gibt es einen besseren Weg, dies zu tun? Ich sollte auch erwähnen, dass ich nicht sehr groß mit Leistung betrifft, und würde es vorziehen, nicht mit Zeigern oder unsichere Codeblöcke wie dieser Typ .

Wenn es überhaupt hilft hier einen guten Artikel auf dem RIFF / WAV-Dateiformat.

War es hilfreich?

Lösung

ich nicht schreiben, in C #, kann aber auf einige Orte zeigen, die aus meiner Sicht schlecht sind:

1) Lesen Sie nicht ganze WAV-Dateien im Speicher, es sei denn die Dateien Ihre eigenen Dateien und haben wissentlich geringe Größe.

2) Es gibt keine Notwendigkeit, ein Datum im Speicher einzufügen. Sie können einfach zum Beispiel tun, um die folgenden: Analysieren Sie die Quelldatei speichern Offsets von Chunks und Metadaten im Speicher gelesen; präsentiert die Metadaten für die Bearbeitung in einem Dialogfeld; Schreib RIFF-WAV-Header, fmt Brocken, Übertragung von Audiodaten von Quelldatei beim Speichern (durch das Lesen und Schreiben von Blöcken), Metadaten hinzufügen; Update RIFF-WAV-Header.

3) Versuchen Sie speichern Metadaten in den Schwanz-Datei. Mit dieser Einstellung werden Ergebnisse in nur Tag abwechselnd nicht Neuschreiben ganzer Datei benötigen.

Es scheint, einige Quellen in Bezug auf mit RIFF-Dateien in C # arbeiten, sind vorhanden hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top