我可以使用MediaPlayer播放流中的声音吗?或者,我可以使用URI来访问文件流吗?

问题描述 投票:1回答:3

我正在使用System.Windows.Media.MediaPlayer播放一些声音,我想从ZIP文件中加载这些声音。能够直接从zip文件将这些文件作为流加载而不必解压缩到临时目录会很好。但是,MediaPlayer.open只接受URI。

那么,有没有办法创建一个引用流内容的URI?像内存中的本地主机?是否有从Stream到URI的连接器?

c# uri filestream windows-media-player
3个回答
1
投票

System.Media.SoundPlayer应该做你需要的(你可以完全跳过MediaPlayer和URI)。它有一个构造函数,它接受一个流。


1
投票

我使用MediaPlayer有两个主要原因:

  1. 它支持同时播放并发流(SoundPlayer不支持此功能)
  2. 它允许我检索声音文件的长度/持续时间。

谢谢!


0
投票

由于您需要支持复音,因此一种方法是将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)意味着有人总是需要安装一些东西。

© www.soinside.com 2019 - 2024. All rights reserved.