不支持URI前缀

本文关键字:前缀 URI 不支持 | 更新日期: 2023-09-27 18:16:43

我正在尝试加载和播放一个波文件:

SoundPlayer simpleSound = new SoundPlayer(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
            simpleSound.Play();

没有成功。我得到一个System.NotSupportedException:(见下文)

System.NotSupportedException: The URI prefix is not recognized.
   at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
   at System.Net.WebRequest.Create(Uri requestUri)
   at System.Media.SoundPlayer.LoadSync()
   at System.Media.SoundPlayer.LoadAndPlay(Int32 flags)
   at System.Media.SoundPlayer.Play()

我看了谷歌和SO试图找到一个解决方案,没有工作。使用直接路径播放文件也可以

SoundPlayer simpleSound = new SoundPlayer(@"D:'Projects'MyAssembly'Sounds'10meters.wav");
simpleSound.Play();

我也检查了MyAssembly内容,资源在那里。SoundPlayer不支持打包吗?或者我做错了什么?

不支持URI前缀

pack:// URI方案是特定于WPF的,所以非WPF组件不知道如何处理它…但是,您可以检索此资源的流,并将其传递给SoundPlayer构造函数:

Uri uri = new Uri(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
StreamResourceInfo sri = Application.GetResourceStream(uri);
SoundPlayer simpleSound = new SoundPlayer(sri.Stream);
simpleSound.Play();

另一个选择是使用MediaPlayer类:

Uri uri = new Uri(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
MediaPlayer player = new MediaPlayer();
player.Open(uri);
player.Play();

这个类支持pack:// URI方案

F1是你的朋友(至少在VS 2010中):

传递给soundLocation参数的字符串可以是文件路径,也可以是.wav文件的URL。

uri不是url(与其他方式不同),这不起作用。如果需要,您可以将文件保存到磁盘上的临时文件夹。