2016-06-28 8 views
1

Ich benutze IrrKlang, um Audio-Eingang von einem Mikrofon zu bekommen. Dieser Teil funktioniert gut, aber ich habe Probleme beim Speichern der Ausgabe in .wav ...Fehler nach dem Speichern der .wav-Datei

Die Wave-Datei scheint zu speichern, aber es scheint nicht zu spielen. Ich frage mich, ob mein Header einige, wie formatiert falsch ist:

private void SaveWave(string path, AudioFormat format, byte[] waveData) 
    { 
     //Play the audio for testing purposes 
     ss = engine0.AddSoundSourceFromPCMData(waveData, "sound", format); 
     engine0.Play2D(ss, true, false, false); 

     // write wave header 
     ushort formatType = 1; 
     ushort numChannels = (ushort)format.ChannelCount; 
     ulong sampleRate = (ulong)format.SampleRate; 
     ushort bitsPerChannel = (ushort)(format.SampleSize * 8); 
     ushort bytesPerSample = (ushort)format.FrameSize; 
     ulong bytesPerSecond = (ulong)format.BytesPerSecond; 
     ulong dataLen = (ulong)format.SampleDataSize; 

     const int fmtChunkLen = 16; 
     const int waveHeaderLen = 4 + 8 + fmtChunkLen + 8; 

     ulong totalLen = waveHeaderLen + dataLen; 
     /// 
     FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write); 
     BinaryWriter bw = new BinaryWriter(fs); 
     byte[] riff = System.Text.Encoding.ASCII.GetBytes("RIFF"); 
     bw.Write(riff); 
     bw.Write(totalLen); 
     byte[] fmt = System.Text.Encoding.ASCII.GetBytes("WAVEfmt "); 
     bw.Write(fmt); 
     bw.Write(fmtChunkLen); 
     bw.Write(formatType); 
     bw.Write(numChannels); 
     bw.Write(sampleRate); 
     bw.Write(bytesPerSecond); 
     bw.Write(bytesPerSample); 
     bw.Write(bitsPerChannel); 
     byte[] data = System.Text.Encoding.ASCII.GetBytes("data"); 
     bw.Write(data); 
     bw.Write(waveData.Length); 
     bw.Write(waveData); 
     bw.Close(); 
     fs.Close(); 
    } 

Antwort

0

Sie schreiben die string Header falsch.

BinaryWriter.Write(string) ist nicht für das Schreiben so gedacht. Nach diesem msdn article, es setzt seine Länge auf die string, bevor es schreibt.

Sie müssen diese Header als bytes schreiben.

Machen Sie es wie diese,

byte[] riff= System.Text.Encoding.ASCII.GetBytes("RIFF"); 
bw.Write(riff); 
byte[] fmt = System.Text.Encoding.ASCII.GetBytes("WAVEfmt "); 
bw.Write(fmt); 
// Remove the space in "data " to "data" 
//byte[] data= System.Text.Encoding.ASCII.GetBytes("data "); 
byte[] data= System.Text.Encoding.ASCII.GetBytes("data"); 
bw.Write(data); 

Rest der den Kopf feinen scheinen.

Hoffe, das hilft dir

+0

Hey Vishnu, ich habe nach Ihren Anweisungen aktualisiert. Das selbe Problem, es speichert die .wav, aber es spielt nicht wirklich. Sind die Räume in der WAVEfmt angeblich da? – Taurian

+0

@Taurian versuchen Sie den Schnitt, den ich vorgeschlagen habe. Das sollte funktionieren –

+0

Bummer, kein Glück. Hier ist der Fehler, den ich bekomme: http://imgur.com/gjJK0lu Ich werde auch den Beitrag mit meinem Code aktualisieren. – Taurian

Verwandte Themen