سؤال

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?

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top