1

我想对 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,它对我来说很好用。

有谁知道为什么?

4

3 回答 3

2

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

SP.PlaySync

SP.Play();

是异步的,在点击那条线后,您离开 Sub 而它仍在后台播放,并且内存流可能已被修改或从内存中删除。

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

于 2016-04-22T15:54:28.377 回答
1

尝试:

SP.Stream.Position = 0;

至少对于我的情况来说,这是一个解决方案。

于 2013-08-25T16:31:41.370 回答
0

将所需的音频文件正确格式化为 .wav 文件!

我认为这会起作用:

soundPlayer.Stream.Position = 0;

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

试试这个网站格式化:http ://audio.online-convert.com/convert-to-wav

于 2016-06-04T20:47:51.870 回答