如何在C#中播放提取的波形文件字节数组?

目前,我已设法分离WAVE文件的左右声道,并将标头包含在byte []数组中。 我的下一步是打两个频道。 如何才能做到这一点?

这是一段代码:

byte[] song_left = new byte[fa.Length]; byte[] song_right = new byte[fa.Length]; int p = 0; for (int c = 0; c < 43; c++) { song_left[p] = header[c]; p++; } int q = 0; for (s = startByte; s < length; s = s + 3) { song_left[s] = sLeft[q]; q++; s++; song_left[s] = sLeft[q]; q++; } p = 0; for (int c = 0; c < 43; c++) { song_right[p] = header[c]; p++; } 

这部分是从右声道和光通道读取标题和数据,并将其保存到数组sLeft []和sRight []。 这部分工作得很好。

一旦我获得了字节数组,我就做了以下事情:

 System.IO.File.WriteAllBytes("c:\\left.wav", song_left); System.IO.File.WriteAllBytes("c:\\right.wav", song_right); 

添加了一个按钮来播放保存的wave文件:

 private void button2_Click(object sender, EventArgs e) { spWave = new SoundPlayer("c:\\left.wav"); spWave.Play(); } 

一旦我点击播放按钮,这个错误就会出现:

System.dll中出现未处理的“System.InvalidOperationException”类型exception

附加信息:wave标头已损坏。

有任何想法吗?

对于“分隔WAVE文件的左右声道”,请使用http://alvas.net/alvas.audio.aspx中的 AudioCompressionManager.SplitStereo方法。

以下代码为您的目的

  IntPtr formatMono = AudioCompressionManager.CreateFormat(formatArray); IntPtr formatStereo = IntPtr.Zero; byte[] dataStereo = null; AudioCompressionManager.MergeStereo(formatMono, leftData, rightData, ref formatStereo, ref dataStereo); PlayerEx plex = new PlayerEx(); plex.OpenPlayer(formatStereo); plex.AddData(dataStereo); plex.StartPlay(); 

我在codeplex上有一个用于播放波形数据的库。

http://WinMM.codeplex.com

我有一个项目,基于上面的库,声音加载和播放做了很多:

http://files.otac0n.com/ShadySound.zip
(此链接可能需要一段时间才能开始工作,我刚刚创建了该子域。)

它有几个项目,因为一切都是通过插件基础设施加载的,但它确实显示了如何加载WAV文件。

不幸的是,对于像这样的QA网站来说,你所拥有的问题有点过于“大”,但我很乐意离线与你讨论这个问题。