我正在使用System.Windows.Media.MediaPlayer
播放一些声音,我想从ZIP文件中加载这些声音。能够直接从zip文件将这些文件作为流加载而不必解压缩到临时目录会很好。但是,MediaPlayer.open
只接受URI。
那么,有没有办法创建一个引用流内容的URI?像内存中的本地主机?是否有从Stream到URI的连接器?
System.Media.SoundPlayer应该做你需要的(你可以完全跳过MediaPlayer和URI)。它有一个构造函数,它接受一个流。
我使用MediaPlayer有两个主要原因:
谢谢!
由于您需要支持复音,因此一种方法是将PInvoke引入waveOutXXXX Windows API以播放声音。以下是如何在C#中执行此操作的一个很好的示例:
https://www.codeproject.com/KB/audio-video/cswavplay.aspx
此示例还包含用于读取持续时间,采样率,每个样本的位等信息的代码。
如果您搜索,您可能会发现waveOutXXXX API一次只能播放一个声音。在Windows 95/98中也是如此,但不再适用。
顺便说一句,SoundPlayer可能是最令人沮丧的.NET类。 .Play()方法会在启动之前自动停止播放您的进程播放的任何其他声音(它可能是任何.NET应用程序播放的任何其他声音),这就是您无法使用它进行复音的原因。如果将.DontStopJustPlay()方法或StopFirst bool参数添加到.Play()方法,那么微软最差的实习生将花费不到一分钟的时间。它可能要到午餐时间才能添加持续时间属性。
尽管waveOutXXXX比精心设计的现代API(并在.NET中使用它引入了额外的问题)更加棘手,但它具有的一个无与伦比的优势是它自Windows 95以来预先安装在每台Windows计算机上,包括Windows Mobile设备。每个其他选项(包括MediaPlayer)意味着有人总是需要安装一些东西。