2016-06-28 2 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

안녕하세요, 귀하의 지침에 따라 업데이트했습니다. 동일한 문제는 .wav를 저장하지만 실제로 재생되지는 않습니다. WAVEfmt의 공간이 있어야합니까? – Taurian

+0

@Taurian 내가 제안한 편집을 시도하십시오. 이것은 작동해야합니다 –

+0

행운, 행운을 빌어 요. 여기에 오류가 있습니다 : http://imgur.com/gjJK0lu 또한 코드를 사용하여 게시물을 업데이트합니다. – Taurian

관련 문제