Wave Header已损坏

时间:2013-05-22 06:07:14

标签: c# .net wave

我想在Wave文件上进行一些更改,然后在执行此操作后直接播放。

所以我定义了一个字节数组来存储波形文件的字节,如下所示:

byte[] byteArr;
byteArr = File.ReadAllBytes(dlg.FileName);

其中dlg是OpenFile对话框。

然后我更改为采样比特率如下:

private void playSlectedWave_Click(object sender, EventArgs e)
{
    int sample = 50000;
    MemoryStream fs = new MemoryStream(byteArr);
    BinaryReader br = new BinaryReader(fs);
    int length = (int)fs.Length-8;
    fs.Position = 22;
    short channels = br.ReadInt16();
    fs.Position = 34;
    short BitsPerSample = br.ReadInt16();
    byte[] arrfile = new byte[fs.Length];
    fs.Position = 0;
    fs.Read(arrfile, 0, arrfile.Length);
    BinaryWriter bw = new BinaryWriter(fs);
    bw.BaseStream.Seek(0, SeekOrigin.Begin);
    bw.Write(arrfile, 0, 24); 
    bw.Write(sample);
    bw.Write((int)(sample* ((BitsPerSample * channels) / 8)));
    bw.Write((short)((BitsPerSample * channels) / 8));
    bw.Write(arrfile, 34, arrfile.Length - 34);
    SoundPlayer SP = new SoundPlayer(fs);
    SP.Play();
}

我的问题是当它到达SP.Play()时会抛出一个异常,说明Wave Header已损坏。

有关更多信息,我尝试使用FileStream而不是MemoryStream的前一个代码,它对我来说很好。

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

尝试:

SP.Stream.Position = 0;

至少在我的情况下,这是一个解决方案。

答案 1 :(得分:1)

在您的子/功能之外定义您的SoundPlayer SP或使用

SP.PlaySync
SP.Play();

Async,在点击该行之后,当它仍然在后台播放时你离开Sub并且内存流可能被修改或从内存中删除。

你很幸运,你只得到一个例外,即使在没有任何例外的情况下进行调试,你的程序也有可能崩溃。

答案 2 :(得分:0)

将您想要的音频文件正确格式化为.wav文件!

我认为这样可行:

soundPlayer.Stream.Position = 0;

但遗憾的是,它汇编无济于事......

尝试使用此网站进行格式化:http://audio.online-convert.com/convert-to-wav