2016-06-28 81 views
1

我使用irrKlang从麦克风获取音频输入。这部分效果很好,但我在将输出保存为.wav时遇到了问题...保存.wav文件后出错

波形文件似乎可以保存正常,但似乎不起作用。我想知道如果我的头是一些如何误格式化:

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(); 
    } 

回答

0

你错写string头。

BinaryWriter.Write(string)并不意味着这样写。根据此msdn article,它在写入之前将其前缀改为string

您需要将这些标题写为bytes

做到像这些,

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); 

头的休息似乎罚款。

希望这可以帮助你

+0

嘿Vishnu,我已根据您的指示更新。同样的问题,它确实保存了.wav,但实际上并没有发挥作用。 WAVEfmt中的空间应该在那里吗? – Taurian

+0

@Taurian尝试我建议的编辑。这应该工作 –

+0

无赖,没有运气。这里是我得到的错误:http://imgur.com/gjJK0lu 我也会用我的代码更新这篇文章。 – Taurian