0

我必须设计一个播放声音的程序(来自 WAV 文件)。我必须创建一个 wav 并播放它。完成后,我必须更改该波形文件的内容并再次播放。这就像播放一个不断变化的波形文件。我想创建一个流,但问题是当我编辑该流时(使用 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。

谢谢!

4

1 回答 1

0

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

如果上述方法失败,或者只是因为您像我一样是性能狂,我建议您使用 DirectSound(托管 DirectX 的一部分)(如果可用)或导入并使用位于 winmm.dll 中的本机波函数和结构来实现您的目标想。

很抱歉这个模糊的答案,但我只是没有时间彻底测试它。

于 2012-01-17T10:28:21.953 回答