简体   繁体   中英

How to play a WPF Sound File resource

I am trying to play a sound file in my WPF application. Currently I have the following call:

private void PlaySound(string uriPath)
{
    Uri uri = new Uri(@"pack://application:,,,/Media/movepoint.wav");
    var player = new MediaPlayer();
    player.Open(uri);
    player.Play();
}

Now if I specify Media/movepoint.wav as build action Content and load it as a relative or absolute file path it works fine, so I suspect this has something to do with the Pack URI , but I cannot for the life of me figure out what.

The objective is to store the file as a resource so that its not available in the output directory. I can provide either the WAV copy or the MP3 copy.

I tried this with an image file, which works the same as a sound file as far as the uri is concerned because it's just another resource. I used the code below which essentially matches what you have.

new Uri(@"pack://application:,,,/Resources/logo.png")

Make sure that your 'Media' folder is not nested in any other folder. If it is, you need to include that folder as well.

Using .NET Framework 4.0, VS2012.

This link gives a pretty good description of the whole "pack" scheme of things.

EDIT

More research on this topic seems to indicate that what you want to do might not be possible with audio or video files. The excerpt below is taken from the remarks section of this MSDN page .

Although you can declare an instance of this class in Extensible Application Markup Language (XAML), you cannot load and play its media without using code. To play media in XAML only, use a MediaElement. Also, if you declare an instance in XAML, the only practical use is to fill property element syntax for the Player property.

When distributing media with your application, you cannot use a media file as a project resource. In your project file, you must instead set the media type to Content and set CopyToOutputDirectory to PreserveNewest or Always.

MediaPlayer can be used in two different modes, depending on what is driving the player: independent mode or clock mode. In independent mode, the MediaPlayer is analogous to an image and the media opened through the Open method drives playback. In Clock mode, the MediaPlayer can be thought of as a target for an animation, and thus it will have corresponding Timeline and Clock entries in the Timing tree which controls playback. For more information on media modes, see the Multimedia Overview.

MediaPlayer is different from a MediaElement in that it is not a control that can be added directly to the user interface (UI) of an application. To display media loaded using MediaPlayer, a VideoDrawing or DrawingContext must be used.

The following seems to work in .NET Framework 4.5:

var sri = Application.GetResourceStream(new Uri("pack://application:,,,/MyAssemblyName;component/Resources/CameraShutter.wav"));

if ((sri != null)) 
{
  using (s == sri.Stream) 
  {
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(s);
    player.Load();
    player.Play();
  }
}

CameraShutter.wav is embedded as Resource in my project (and resides inside Resources subfolder, as indicated in the pack URI).

You can also load a Stream into the SoundPlayer if the .wav file is an Embedded Resource. Note that in this example the resources are in a folder called Resources that is in the root of the project, that is why it is written {0}.Resources.{1} .

//the wav filename
string file = "emergency_alarm_002.wav";

//get the current assembly
var assembly = System.Reflection.Assembly.GetExecutingAssembly();

//load the embedded resource as a stream
var stream = assembly.GetManifestResourceStream(string.Format("{0}.Resources.{1}", assembly.GetName().Name, file));

//load the stream into the player
var player = new System.Media.SoundPlayer(stream);

//play the sound
player.Play();

This also seems to work and is maybe simpler to remember than that long line of pack or assembly stuff.. I opened the Resources.resx and dragged a sound file in there called aa_pickup.wav Then set the properties of it to Copy to Output Dir = Copy Always.

System.IO.Stream str = Properties.Resources.aa_pickup;
System.Media.SoundPlayer snd = new System.Media.SoundPlayer(str);
snd.Play();

Now.. if I could only work out how to change the volume.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM