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

3

目前我已经成功将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);

新增了一个按钮,用于播放保存的波形文件:

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

一旦我按下播放按钮,就会出现以下错误:

System.dll 中发生了“System.InvalidOperationException”的未处理异常。

其他信息:波形标头损坏。

你有什么想法吗?

我成功解决了它 :) - Tristan Demanuele
1
添加一份说明,以便其他人受益。 - AShelly
2个回答

1
对于“分离WAVE文件的左右声道”,请使用AudioCompressionManager.SplitStereo方法,链接:http://alvas.net/alvas.audio.aspx 以下是您所需要的代码。
        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();

0

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

http://WinMM.codeplex.com

我有一个项目,它与声音加载和播放有很多关联,基于上述库:

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

它有几个项目,因为所有东西都是通过插件架构加载的,但它确实展示了如何加载WAV文件。

不幸的是,你提出的问题对于像这样的QA网站来说有点太“大”了,但我很乐意在离线时与你讨论这个问题。


电子邮件:spoonfuloftactic@gmail.com - John Gietzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接