2016-06-28 4 views
1

を保存した後、私は、マイクからの音声入力を取得するirrKlangを使用しています。 waveファイルがOK保存するように見えるが、プレーしていないようです、その部分は素晴らしい作品が、私は.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

あなたの指示に従って更新しました。同じ問題、それは.wavを保存しますが、実際には再生されません。 WAVEfmtのスペースはそこにあるはずですか? – Taurian

+0

@Taurian私は示唆した編集を試してください。これは –

+0

残念、運が動作するはずです。ここに私が得るエラーがあります:http://imgur.com/gjJK0lu また私のコードで投稿を更新します。 – Taurian