从流播放wav文件

时间:2012-01-13 11:58:51

标签: c# wav wave

我必须设计一个播放声音的程序(来自WAV文件)。我必须创建一个wav并播放它。一旦完成,我必须更改该wave文件的内容并再次播放。这就像播放一个不断变化的波形文件。我想创建一个流,但问题是当我编辑该流(使用ms.Postion和ms.WriteByte)时,发生错误,说“波头文件已损坏”。以下是我的代码:

MemoryStream ms = new MemoryStream(Sample1);
SoundPlayer myPlayer = new SoundPlayer(ms);
myPlayer.Play();                             //Wav file plays

for (int x = 0; x < 50; x++)
{
     ms.Position = 44 + x;
     ms.WriteByte(10);
}

myPlayer.Stop();
myPlayer.Play();                 //Header file corrupt

是否有其他方法可以循环播放流,并在播放时更改其内容。例如,流循环Sound1,每当按下按钮时,流的内容将更改为播放Sound2。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您可能需要刷新流。

for (int x = 0; x < 50; x++)
{
     ms.Position = 44 + x;
     ms.WriteByte(10);
     ms.Flush();
}

//When you are done with all the actions
ms.Dispose();

最好在发生错误时最后使用或尝试处理流。

答案 1 :(得分:0)

我试图做同样的事情,也失败了。似乎SoundPlayer类将内容复制到内部缓冲区或直接保留声卡内存。第一次调用play时,它还会调用Load来执行前面提到的操作。将相同的流重新分配给类并没有帮助我,调用Load来强制它重新加载内容也失败了。我不知道他们是如何实现这个类的,但我认为你需要有两个SoundPlayer类和(very likely)你可以使用相同的流(尽管我认为你可以'同时播放它们,不是因为共享流而是因为其他问题)。如果生成的wave不是很大,你也可以尝试使用一个带有两个内存流的SoundPlayer类(我认为如果你为该类分配一个不同的内存流,它应该强制重新加载)。我没有测试任何提议的解决方案。只需记住在将流传递给SoundPlayer类之前将其回滚(我怀疑这是头部损坏问题的原始问题)。我没有测试过这个,但我认为它应该可行。至少在我的知识中,更改Sample1的内容不应该对内存流产生任何影响

如果上述方法失败,或者仅仅因为你是我这样的表演狂,我建议您使用DirectSound(托管DirectX的一部分)(如果可用)或导入并使用位于winmm.dll中的原生波函数和结构来实现你想要的东西。

对于模糊的回答感到抱歉,但我没有时间对其进行彻底的测试。