Wave Header erzeugen

  • Antworten:2
Andreas Hoffmann
  • Forum-Beiträge: 36

26.11.2012, 00:26:07 via Website

Hallo Leute,

ich habe leider Probleme mit dem erzegen einer Wave-Datei. Über den AudioRecorder nehme ich das Mikrofon auf und speichere die PCM-Informationen in einem Array. Nun möchte ich eine WAVE-Datei erzeugen und habe eine Methode für die Erzeugung eines Headers. Leider scheint die Methode nicht richtig zu funktionieren, denn bei dem Versuch die Datei abzuspielen bekomme ich einen Fehler.

Leider finde ich meinen Fehler nicht =(

Wäre echt super, wenn mir jemand weiter helfen könnte =)

Meine Parameter sind
sampleRate = 44100
bitRate = 16
channels = 1
totalAudioLength = bei mir ist es ein Short-Array, also array.size() * 2;

1private byte[] getWaveHeader(int sampleRate, int bitrate, int channels, int totalAudioLength)
2 {
3 byte[] header = new byte[44];
4
5 int totalDataLen = header.length - 8 + totalAudioLength;
6 int byterate = ((sampleRate * bitrate) / 8);
7
8
9 header[0] = 'R'; // RIFF/WAVE header
10 header[1] = 'I';
11 header[2] = 'F';
12 header[3] = 'F';
13 header[4] = (byte) (totalDataLen & 0xff);
14 header[5] = (byte) ((totalDataLen >> 8) & 0xff);
15 header[6] = (byte) ((totalDataLen >> 16) & 0xff);
16 header[7] = (byte) ((totalDataLen >> 24) & 0xff);
17 header[8] = 'W';
18 header[9] = 'A';
19 header[10] = 'V';
20 header[11] = 'E';
21 header[12] = 'f'; // 'fmt ' chunk
22 header[13] = 'm';
23 header[14] = 't';
24 header[15] = ' ';
25 header[16] = 16; // 4 bytes: size of 'fmt ' chunk
26 header[17] = 0;
27 header[18] = 0;
28 header[19] = 0;
29 header[20] = 1; // format = 1
30 header[21] = 0;
31 header[22] = (byte) channels;
32 header[23] = 0;
33 header[24] = (byte) (sampleRate & 0xff);
34 header[25] = (byte) ((sampleRate >> 8) & 0xff);
35 header[26] = (byte) ((sampleRate >> 16) & 0xff);
36 header[27] = (byte) ((sampleRate >> 24) & 0xff);
37 header[28] = (byte) (byterate & 0xff);
38 header[29] = (byte) ((byterate >> 8) & 0xff);
39 header[30] = (byte) ((byterate >> 16) & 0xff);
40 header[31] = (byte) ((byterate >> 24) & 0xff);
41 header[32] = (byte) (bitrate / 8); // block align
42 header[33] = 0;
43 header[34] = (byte) bitrate; // bits per sample
44 header[35] = 0;
45 header[36] = 'd';
46 header[37] = 'a';
47 header[38] = 't';
48 header[39] = 'a';
49 header[40] = (byte) (totalAudioLength & 0xff);
50 header[41] = (byte) ((totalAudioLength >> 8) & 0xff);
51 header[42] = (byte) ((totalAudioLength >> 16) & 0xff);
52 header[43] = (byte) ((totalAudioLength >> 24) & 0xff);
53
54 return header;
55 }

LG Andy

— geändert am 26.11.2012, 00:28:13

Antworten
Andreas Hoffmann
  • Forum-Beiträge: 36

26.11.2012, 19:43:10 via Website

Hallo ich bin's wieder... Es hat sich zwar keinen Interessiert, aber falls doch irgendwann Interesse besteht...
Ich habe meinen Fehler gefunden. Es lag anscheinend nicht an der Methode sondern an meinen Parametern.
Ich habe die totalAudioLength falsch angegeben =(
Also falls jemand eine Methode braucht um eine Wave-Datei mit PCM-Rohdaten zu erzeugen, die Methode sollte funktionieren...

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

26.11.2012, 20:30:47 via Website

Andreas Hoffman
Hallo ich bin's wieder... Es hat sich zwar keinen Interessiert, aber falls doch irgendwann Interesse besteht...
Ich habe meinen Fehler gefunden. Es lag anscheinend nicht an der Methode sondern an meinen Parametern.
Ich habe die totalAudioLength falsch angegeben =(
Also falls jemand eine Methode braucht um eine Wave-Datei mit PCM-Rohdaten zu erzeugen, die Methode sollte funktionieren...

Also interessiert hats mich schon sehr - will auch sowas in meine App einbauen.
Konnte Dir bloß leider nicht helfen da ich mich damit noch nicht auskenne.
Gelesen wirts schon .....

— geändert am 26.11.2012, 20:31:19

Antworten