C# 波头损坏
我想对Wave文件做一些修改,然后在修改后直接播放 所以我定义了一个字节数组来存储wave文件的字节,如下所示: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
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之前,它就会工作。