问题
I am trying to load and play a wave file using:
SoundPlayer simpleSound = new SoundPlayer(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
simpleSound.Play();
With no success. I get a System.NotSupportedException
:( see below.
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()
I looked over google and SO trying to find a solution, nothing worked. Playing the file with a direct path works fine
SoundPlayer simpleSound = new SoundPlayer(@"D:\Projects\MyAssembly\Sounds\10meters.wav");
simpleSound.Play();
I also checked MyAssembly content, the resource is there.
Does SoundPlayer
not support packing or there anything I am not doing correctly?
回答1:
The pack://
URI scheme is specific to WPF, so non-WPF components don't know how to handle it... however, you can retrieve a stream for this resource, and pass it to the SoundPlayer
constructor:
Uri uri = new Uri(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
StreamResourceInfo sri = Application.GetResourceStream(uri);
SoundPlayer simpleSound = new SoundPlayer(sri.Stream);
simpleSound.Play();
Another option is to use the MediaPlayer
class:
Uri uri = new Uri(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
MediaPlayer player = new MediaPlayer();
player.Open(uri);
player.Play();
This class supports the pack://
URI scheme
回答2:
F1 is your friend (in VS 2010 at least):
The string passed to the soundLocation parameter can be either a file path or a URL to a .wav file.
URIs are not URLs (unlike the other way around), this will not work. You could save the file to temporary folder on disk if you need to.
来源:https://stackoverflow.com/questions/8344380/uri-prefix-not-supported