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

时间:2010-02-04 19:59:06

标签: c# audio wav

目前我已设法分离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.InvalidOperationException'的未处理异常   发生在System.dll

中      

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

对于“分隔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();

答案 1 :(得分:0)

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

http://WinMM.codeplex.com

我有一个项目可以根据上面的库进行声音加载和播放:

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

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

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