mikrocontroller.net

Forum: PC-Programmierung C++: Auslesen einer .wav


Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein Problem beim Auslesen einer wav Datei. Ich möchte im ersten 
Schritt nur den Header auslesen. Dieser ist 44Byte lang und soll in 
einem Buffer gespeichert werden und in ein neues Textdokument geschieben 
werden. Mein Code sieht folgendermaßen aus:
char *buffer;
buffer = new char [44];
fstream lut_file, wav;
wav.open("test2.wav", ios::in | ios::binary);
wav.read(buffer,44);
lut_file.open("C:\\TEST.txt", ios::out);

In der wav. Datei kommt nach dem einleitenden "RIFF" eine Zahl und 
danach Leerzeichen. Und genau bei diesem leerzeichen stoppt das einlesen 
und es wird nur "RIFF4" in die txt geschrieben. Können da irgendwelche 
Steuerzeichen versteckt sein? Wie kann ich den Inhalt einer Datei 
auslesen und wirklich alle Zeichen auslesen?

Gruß

Lars

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass korrekt eingelesen wird, und nur GLAUBST, es würde 
nach RIFF aufhören? Schließlich kommt danach ja eine Binärzahl, die 
wahrscheinlich ein Nullbyte enthält. Wenn du jetzt buffer als 
nullterminierten String betrachtest, endet der dort natürlich.

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, wie meinst du das? Im endeffekt möchte ich, dass egal, was dort 
steht, dies auch wieder in das neue textfile geschrieben wird. Wie 
stelle ich das an?

Autor: the other side of horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du liest die Wave-Datei mit ios::binary, schreibst aber in die 
"Text"-Datei ohne dieses Flag.

Dämmert's?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, er schreibt ja noch nichts lt. seinem Fragment.

@ Lars (Gast): Wer sagt denn, daß das Lesen stoppt?

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich habe das Problem gelöst, es lag an dem von Klaus genannten 
Problem! Vielen Dank dafür schonmal:)
Nun habe ich ein weiteres Problem, Dabei geht es um die Arbeit mit 
Zeigern:
short *daten;
long buffersize;
    
buffersize = w.SubChunk2Size / 4;  
daten = new short [buffersize];

wav.seekg(44, ios::beg);
wav.read((char*)&daten, buffersize * 2);

In dem Code soll ein Array (daten) im Speicher erzeugt werden, in 
welches die einzelnen Samples aus der .wav Datei abgespeichert werden. 
Beim debuggen stürzt VS immer ab, mit unterschiedlichen Fehlermeldungen. 
Meistens Meldungen, die Stackviolation oder ähnliches erwähnen. Hab ich 
da nen Denkfehler?

Achso, buffersize liegt meistens so im Bereich von 100000. Damit würden 
im Speicher 200kByte reserviert werden. Das dürfte doch eigentlich auch 
kein Problem sein, oder?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
&daten

Ein Pointer auf einen Pointer? Ich wette Du wolltest nur den Pointer 
selbst übergeben, also lass das & weg.

CU

Autor: Chris L. (kingkernel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mal das Problem, das beim Schreiben einer Datei alles hinter 
\0 angeschnitten wurde. Hast du mal kontrolliert, ob das auch so ist!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.