myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[JAVA] Wave-Header für PCM-Rohdaten erzeugen

Willkommen

myGully

Links

Forum

 
 
 
Themen-Optionen Ansicht
Prev Vorheriger Beitrag   Nächster Beitrag Next
Ungelesen 26.11.12, 16:04   #1
optikandy
Anfänger
 
Registriert seit: Jul 2010
Beiträge: 14
Bedankt: 1
optikandy ist noch neu hier! | 0 Respekt Punkte
Standard [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;
    }
optikandy ist offline   Mit Zitat antworten
 


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

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr.


Sitemap

().