我必须设计一个播放声音的程序(来自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。
谢谢!
答案 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中的原生波函数和结构来实现你想要的东西。
对于模糊的回答感到抱歉,但我没有时间对其进行彻底的测试。