Hallo Leute
,
ich habe leider Probleme mit dem Erzeugen einer Wave-Datei
. Ich nehmne über das Mikrofon auf und speichere die PCM-Rohdaten in einem Array. Nun möchte ich eine WAVE-Datei erzeugen und habe eine Methode für die Erzeugung eines Headers (siehe unten). 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 =)
LG Andy
Meine Parameter sind
sampleRate = 44100
bitRate = 16
channels = 1
totalAudioLength = die PCM-Rohdaten sind in einem Short-Array, also array.size() * 2;
Code:
private byte[] getWaveHeader(int sampleRate, int bitrate, int channels, int totalAudioLength)
{
byte[] header = new byte[44];
int totalDataLen = header.length - 8 + totalAudioLength;
int byterate = ((sampleRate * bitrate) / 8);
header[0] = 'R'; // RIFF/WAVE header
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f'; // 'fmt ' chunk
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1; // format = 1
header[21] = 0;
header[22] = (byte) channels;
header[23] = 0;
header[24] = (byte) (sampleRate & 0xff);
header[25] = (byte) ((sampleRate >> 8) & 0xff);
header[26] = (byte) ((sampleRate >> 16) & 0xff);
header[27] = (byte) ((sampleRate >> 24) & 0xff);
header[28] = (byte) (byterate & 0xff);
header[29] = (byte) ((byterate >> 8) & 0xff);
header[30] = (byte) ((byterate >> 16) & 0xff);
header[31] = (byte) ((byterate >> 24) & 0xff);
header[32] = (byte) (bitrate / 8); // block align
header[33] = 0;
header[34] = (byte) bitrate; // bits per sample
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (totalAudioLength & 0xff);
header[41] = (byte) ((totalAudioLength >> 8) & 0xff);
header[42] = (byte) ((totalAudioLength >> 16) & 0xff);
header[43] = (byte) ((totalAudioLength >> 24) & 0xff);
return header;
}