Wave Datei mit ANSI C Dateioperationen auslesen
-
Hallo zusammen,
ich möchte ein Wave File mit den Standard Dateioperationen auslesen.
mit fseek Überspringe ich schon mal den Header also die ersten 44 bytes.
Möchte also nur den Data Chunk lesen.
Den gesamten DataChunk möchte ich in einzelnen Samples a 160 byte an ein RTP Packet hängen und via UDP versenden.
Das funktioniert alles auch soweit außer das am anderen Ende nur elendiges gekreische ankommt.Könnte es sein das etwas bei dem was ich auslese noch falsch ist?
Ich hole mir via fread immer die nächsten 160byte encodiere die im gewünschten Codec und versende sie.
Am Codec kann es nicht liegen, da es bei allen Codecs nur das Kreischen versendet.Gruß
Karsten
-
Wenn du schon im Titel ANSI C schreibst, wieso fragst du dann nicht gleich im ANSI C Forum?
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Uppps...@pumuckl
Du hast natürlich recht:D:D
Sorry;)
-
Das klingt doch soweit richtig. Öffnest du die Datei als Binärdatei, also mit fopen(,"rb")? Achtest du auf richtige Endianess (WAV-Dateien sind little-endian)? Bist du sicher, dass die Kodierung in der WAV-Datei (eventuell was anderes als 16-bit PCM) und Anzahl der Kanäle das ist, was du erwartest (bzw. der Codec erwartet)?
-
Jap wird als Binärdatei geöffnet, Endianess ist auch korrekt.
Die Datei ist auch laut Audacity und den Header - Information die ich selbst auslese 16bit PCM, 8kHz Mono genauso wie gewünscht.
-
So ich hab noch einmal was probiert was ich in einem Beispiel gefunden habe...
FILE* pWaveFile = fopen(WaveDataFile, "rb"); fseek(pWaveFile, 0, SEEK_SET); //Reading the Header TotalRead = fread(szChunkId1, 1, 4, pWaveFile); TotalRead = fread(&szChunkSize1, 1, 4, pWaveFile); TotalRead = fread(szFormat, 1, 4, pWaveFile); TotalRead = fread(szSubChunkId1, 1, 4, pWaveFile); TotalRead = fread(&szSubChunkSize1, 1, 4, pWaveFile); TotalRead = fread(&szAudioFormat, 1, 2, pWaveFile); TotalRead = fread(&szNumChannels, 1, 2, pWaveFile); TotalRead = fread(&szSampleRate, 1, 4, pWaveFile); TotalRead = fread(&szByteRate, 1, 4, pWaveFile); TotalRead = fread(&szBlockAlign, 1, 2, pWaveFile); TotalRead = fread(&szBitsPerSample, 1, 2, pWaveFile); TotalRead = fread(szSubChunkId2, 1, 4, pWaveFile); ToalRead = fread(&szDataSize, 1, 4, pWaveFile); //Reading DataChunk int nWaveSize = szDataSize / szBlockAlign; short *pData; pData =(short*)malloc(2*nWaveSize); for(int i = 0; i < nWaveSize; i++) { fread(&pData[i], 1, 1, pWaveFile); } fclose(pWaveFile);
So lese ich jetzt die gesamte WaveDatei aus...
Geöffnet wird sie als Binary.Erstmal die Frage ist das so korrekt?
Und 2. weiß ich noch nicht so recht wie ich hier jetzt meine 160b großen Blöcke am besten aus dem Pointer ziehe...
Versucht habe ich es bereits...immer 160bytes lesen...offset wegschreiben...Datenblock nehmen und codieren und versenden...Jeand noch ne Idee wie es besser gehen könnte?