C# 波头损坏

C# 波头损坏,c#,.net,wave,C#,.net,Wave,我想对Wave文件做一些修改,然后在修改后直接播放 所以我定义了一个字节数组来存储wave文件的字节,如下所示: byte[] byteArr; byteArr = File.ReadAllBytes(dlg.FileName); private void playSlectedWave_Click(object sender, EventArgs e) { int sample = 50000; MemoryStream fs = new MemoryStream(byteA

我想对Wave文件做一些修改,然后在修改后直接播放

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

byte[] byteArr;
byteArr = File.ReadAllBytes(dlg.FileName);
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();
}
其中dlg是一个OpenFile对话框

然后我对波形的采样比特率进行如下更改:

byte[] byteArr;
byteArr = File.ReadAllBytes(dlg.FileName);
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头已损坏

关于更多信息,我尝试了前面的代码,但是使用了FileStream而不是MemoryStream,它对我来说很好

有人知道原因吗?

试试:

SP.Stream.Position = 0;

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

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

SP.PlaySync

是异步的,点击该行后,您离开Sub,而它仍在后台播放,memorystream可能会被修改或从内存中删除


幸运的是,您只得到了一个异常,即使调试时没有任何异常,您的程序也有可能崩溃。

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

我认为这会奏效:

soundPlayer.Stream.Position = 0;
但可悲的是,这一切都无济于事


请尝试设置此网站的格式:

@Mark Heath您能在这里提供帮助吗:)@MattJohnson否。您的上一条语句不成立。@MattJohnson当我搜索该语句时,我发现在更改采样器时,我必须只修改ByteRate和BlockAlign的值,我在上面这样做。我认为这里没有问题。无论如何,这不是正确的使用方法。只需设置“fs.Position=0”;在使用SP之前,它就会工作。