我想在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的前一个代码,它对我来说很好。
有人知道为什么吗?
答案 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