Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
26.11.12, 16:04
|
#1
|
Anfänger
Registriert seit: Jul 2010
Beiträge: 14
Bedankt: 1
|
[JAVA] Wave-Header für PCM-Rohdaten erzeugen
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;
}
|
|
|
26.11.12, 17:18
|
#2
|
OS X'ler
Registriert seit: Aug 2012
Ort: /dev/random
Beiträge: 40
Bedankt: 8
|
Hi optikandy,
ich habe keine Ahnung von WAVE-Dateien, habe nur mal ein bisschen mit Wikipedia verglichen, habe aber jetzt so keinen Fehler gefunden.
Apropos Fehler, wie lautet der denn?
Mal versucht, die Datei mit VLC zu starten, der zeigt normalerweise ausführliche Meldungen an.
[EDIT]
Habe mal ein wenig rumgesucht, es gibt ein den [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] eine Klasse namens WaveHeader, da wird ein Header in einen Stream geschrieben. Vielleicht hilft dir das.
|
|
|
26.11.12, 17:57
|
#3
|
Anfänger
Registriert seit: Jul 2010
Beiträge: 14
Bedankt: 1
|
Danke, ich schaue mir mal die Klasse genauer an. Ich habe es versucht mit dem VLC abzuspielen, der macht aber einfach nichts ^^ keine Fehlermeldung aber auch keinen Ton...
Wollte die Datei mal hochladen, aber bei rapidshare und uploaded sollte ich mich zuerst anmelden...!?
|
|
|
26.11.12, 18:27
|
#4
|
Anfänger
Registriert seit: Jul 2010
Beiträge: 14
Bedankt: 1
|
So ^^ Das ist mir jetzt peinlich aber ich habe einen doofen Fehler gemacht...
Der Header scheint zu funktionieren, also ich bekomme keine Fehlermeldung mehr. Nur leider höre ich im Moment nur Rauschen aber vielleicht lässt sich das schnell beheben.
Nun zu dem Fehler. Ich lese in regelmäßigen Abständen ein short[4096] Array von dem Mikrofon. Dieses Array füge ich dann zu einer ArrayList<short[]> hinzu.
Ich habe meiner Methode als totalAudioLength array.size() * 2 übergeben. Richtig war array.size() * bufferSize * 2 ...
ärgerlich ärgerlich ärgerlich...  Wegen so einer kleinen Sache mal wieder ein paar Stunden verschwendet und noch die Zeit von Anderen in Anspruch genommen...
@d03jo4n: Danke für die Hilfe =)
|
|
|
26.11.12, 19:10
|
#5
|
OS X'ler
Registriert seit: Aug 2012
Ort: /dev/random
Beiträge: 40
Bedankt: 8
|
Das ist Softwareentwicklung:
Nach Stunden merkt, dass man nur eine Zahl ändern muss.
__________________
Ghost hardware.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr.
().
|