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”类型的未处理异常

附加信息:波头已损坏。

有任何想法吗?

4

2 回答 2

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();
于 2010-03-25T20:55:25.073 回答
0

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

http://WinMM.codeplex.com

我有一个基于上述库的声音加载和播放项目:

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

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

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

于 2010-02-04T20:02:33.777 回答