WPF中播放声音媒体文件

这段时间我们小组要给部门的Annual Meeting準备一个WPF的抽奖程序,为了增加程序的有趣性,我们在程序中需要播放背景音乐等。由於对之前从未使用过WPF,所以对其中的声音等媒体文件播放不是很清楚,对一些简单的问题也花了相对较长的时间去解决,现在将其总结在下麵,以供大家参考。

1,使用SoundPlayer类

SoundPlayer类位於System.Media命名空间下,它只能播放.wav格式的声音文件。其使用方法简单如下:

using(SoundPlayer player = new SoundPlayer())  
{  
string location=System.Environment.CurrentDirectory+"//Sounds//explosion.wav";  
player.SoundLocation=location;  
player.Play();  
}  

上面的代码段即是播放主程序文件夹内下的Sounds文件夹下的explosion.wav声音文件。如果你的声音文件比较小,可以直接作為资源嵌入到应用程序中,这裡的Location属性使用相对路径即可。

除了上面提到的文件格式限制外,这个类还有个缺陷,就是你只能同时播放一个声音文件,即便你实例化几个不同的类,在我的程序中最初考虑一个背景音乐文件一直循环播放,可是当我把光标放置於另外一个我自己定制的UserControl上,会播放一个声音,而之前的背景音乐就会消失,於是我不得不用其它的方法。

2,使用MediaPlayer类

MediaPlayer类位於System.Windows.Media命名空间下,关於此类详情参考http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer(v=VS.100).aspx

如下示例:

MediaPlayer player = new MediaPlayer();  
player.Open(new Uri(@"sampleMedia/xbox.wmv", UriKind.Relative));  
VideoDrawing aVideoDrawing = new VideoDrawing();  
aVideoDrawing.Rect = new Rect(0, 0, 100, 100);  
aVideoDrawing.Player = player;  
player.Play();  

3,在XAML中使用MediaPlayer元素

MediaPlayer元素可以方便的在XAML中直接使用MediaPlayer,如下示例:

<MediaElement Name="MyMediaElement"> 
<MediaElement.Triggers> 
 <EventTrigger RoutedEvent="MediaElement.Loaded"> 
 <EventTrigger.Actions> 
 <BeginStoryboard> 
 <Storyboard> 
 <MediaTimeline x:Name="mediatiemline" Source=<span style="color: #a31515;">"pack://siteoforigin:,,,/Sounds/test.mp3"</span> Storyboard.TargetName="MyMediaElement" 
 RepeatBehavior="Forever" /> 
 </Storyboard> 
 </BeginStoryboard> 
 </EventTrigger.Actions> 
 </EventTrigger> 
 </MediaElement.Triggers> 
</MediaElement> 

以上示例是在加载时MediaElement循环播放音乐文件。

请注意Source="pack://siteoforigin:,,,/Sounds/test.mp3" 这裡的路径表示方法,亦可以直接在Code-behind中直接设置:

我们可以发现,通过MediaPlayer可以解决文件格式限制问题,还可以解决不能同时播放几个声音的问题。

this.mediatiemline.Source=new Uri(<span style="background-color: #ffff00;">Environment.CurrentDirectory </span>+ <a><span style="color: #4c7d08;">//Sounds//test.mp3</span></a>); 
ps:<span style="background-color: #ffff00;"><span style="color: #ff0000;">Environment.CurrentDirectory:<span style="background-color: #ffffff;">
获取或设置当前工作目录的完全限定路径。这个就解决了相对路径的问题。</span></span></span>  

4,使用MediaPlayer(包括MediaElement)的注意事项

我们在测试的时候发现,由於电脑上Windows Media Player的版本比较低,导致在播放一些音乐文件的时候出问题,没有声音,我们花费了很长时间解决代码的问题,最终发现问题是在Windows Media Player版本上,所以如果大家遇到类似问题请记得更新你的Windows Media Player為较高版本,XP系统可以在这裡下载11.0版本:

http://www.microsoft.com/downloads/details.aspx?familyid=1D224714-E238-4E45-8668-5166114010CA&displaylang=en

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

解决Octopress博客访问慢的问题

买了这个域名已经一周了,已经决定博客的面向群体为汉语用户。但是发现国内访问还是超级慢,慢的让人无法接收了,当然具体原因,大家都懂得。没办法,尝试使用过安全宝,速...

772
来自专栏分享达人秀

RecyclerView分割线开发技巧

在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习RecyclerView的分割线使用。 ...

1988
来自专栏哲学驱动设计

产品前端重构(TypeScript、MVC框架设计)

最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容。 公司期望把某一管理类信息系统从项目代码中抽取、重构为一个可复用的产品。该系统的...

2128
来自专栏移动开发之家

Android蹲坑的疑难杂症集锦一

问大家一个问题,在Github上找项目的时候,看到中文简介说明你们是不是觉得这个项目很low不屑一顾?

523
来自专栏python学习路

十、豆瓣读书爬虫

用了一上午的时间做了个这个,还是比较简单的。多练练,总会进步。遇到了很多问题,庆幸自己都解决了。 我的过程是:(python3) 1、先将豆瓣读书的所有标签以每...

2715
来自专栏菩提树下的杨过

Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地

必须有摄像头,上面的演示才能正常播放。 思路: 使用摄像头以及在线抓屏在上一节Flash/Flex学习笔记(2):捕获摄像头 里已经讲过了,就不重复粘贴了,至于...

1858
来自专栏developerHaoz 的安卓之旅

Android 一起来看看知乎开源的图片选择库

有一点要注意一下, 这个图片选择库是使用 Glide 或 Picasso 作为图片加载引擎

663
来自专栏.NET开发者社区

​(码友推荐)2018-07-14 .NET及相关开发资讯速递

5.Docker and Azure Kubernetes Service for .NET Developers

762
来自专栏张善友的专栏

Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/c...

2005
来自专栏xx_Cc的学习总结专栏

六天完成一个简单iOS App - 第六天

2725

扫描关注云+社区