WPF 播放声音的三种方法
单位近日要办一个歌唱比赛,小丸被委托开发一个随机选人的小工具,想到之前在园子里收藏过一篇《年终了,大家年会有抽奖不?共享个WPF的抽奖程序吧[源码]》,马上找出来看。
阅读代码之后发现:这位大神的3D圆环效果使用Canvas直接瞄坐标绘制,图形学渣渣表示相当钦佩。实际使用中流畅程度也可以接受,只是少了音乐和音效总感觉不太舒服。所以决定添加音乐和音效。
搜索了一番后找到三个方法,
方法一:古老的SoundPlayer类
它是.NET Framework 2.0的一部分,是对Win32 PlaySound API的封装。
它具有以下特征
1) 仅支持.wav音频文件
2) 不支持同时播放多个音频(任何新播放的操作将终止当前正在播放的)
3) 无法控制声音的音量
4) 支持同步、异步播放
5) 支持循环播放
6) 支持文件和流播放
下面的代码展示了如何使用SoundPlayer播放声音:
简单范例 SoundPlayer player = new SoundPlayer("next.wav"); player.Play(); 同步播放: System.Media.SoundPlayer player = new System.Media.SoundPlayer(); player.SoundLocation = @"d:\music\happy.mp3"; player.Load(); player.PlaySync(); 异步播放: System.Media.SoundPlayer player = new System.Media.SoundPlayer(); player.SoundLocation = @"d:\music\happy.mp3"; player.LoadAsync(); player.Play(); 循环播放: System.Media.SoundPlayer player = new System.Media.SoundPlayer(); player.SoundLocation = @"d:\music\happy.mp3"; player.Load(); player.PlayLooping();
传递给SoundPlayer构造函数的字符串可以是本地的一个文件名,也可以是网络上的文件。调用Play方法将异步播放声音。如果想同步播放声音,可以使用PlaySync方法。当然,想异步循环播放,可以使用PlayLooping方法,直到你调用Stop或重新播放一个新的声音为止。
需要说明的是,声音文件直到第一次播放时才会被加载。如果声音文件的加载需要很长的时间,例如从网络来,使用同步播放,会导致UI死掉。出于这个原因考虑,SoundPlayer类也定义了Load和LoadAsync方法以便在第一次播放之前提前加载声音文件。
如果你想播放系统声音,但记不住他们的文件名,可以用SystemSounds类中的一些静态属性:Asterisk,Beep,Exclamation,Hand,Question。每个类型都有自己的Play方法,用来异步播放系统声音。比如:
SystemSounds.Asterisk.Play();
PS:此方法在Winform也可以使用,只需using System.Media;
方法二:.NET Framework 3.0新增的MediaPlayer类
基于Windows Media Player构建起来的,因此支持Windows Media Player能播放的格式。
MediaPlayer具有以下特性
1)可以同时播放多个声音(创建多个MediaPlayer对象);
2)可以调整音量(Volume属性);
3)可以使用Play,Pause,Stop等方法进行控制;
4)可以设置IsMuted属性为True来实现静音;
5)可以用Balance属性来调整左右扬声器的平衡;
6)可以通过SpeedRatio属性控制音频播放的速度;
7)可以通过NaturalDuration属性得到音频的长度,通过Position属性得到当前播放进度;
8)可以通过Position属性进行Seek;
下面的代码展示了如何使用MediaPlayer播放声音:
MediaPlayer player = new MediaPlayer(); player.Open(new Uri("bgm.mp3", UriKind.Relative)); player.Play();
注意: MediaPlayer player = new MediaPlayer();不能在事件处理中,小丸起初将这三行代码放在一个按钮Click事件中,播放几秒后直接被GC干掉,将这句移到事件外即可解决。
MediaPlayer player = new MediaPlayer(); private void Button_Click(object sender, RoutedEventArgs e) { player.Open(new Uri("bgm.mp3", UriKind.Relative)); player.Play(); }
PS:此方法在Winform也可以使用,在引用中添加PresentationCore并using System.Windows.Media即可。
Winform中调用COM组件的步骤
在工具箱上点右键,选择“选择项目(Choose Items)”,切到COM页,找到 Windows Media Player,勾选并点击确定。
在工具箱上,把刚才加入的MediaPlayer控件,拖放到Winform上
axWindowsMediaPlayer1.URL = "文件路径,支持网络路径"; axWindowsMediaPlayer1.Ctlcontrols.play();
其他的操作可以查看axWindowsMediaPlayer1.Ctlcontrols。
方法三:WPF特有的MediaElement元素
关于这个方法我不再多说,园子里已经有大神写了《WPF 4 媒体播放器(MediaElement)》
在WPF 中可以使用MediaElement为应用程序添加媒体播放控件,以完成播放音频、视频功能。由于MediaElement 属于UIElement,所以它同时也支持鼠标及键盘的操作。
XAML
<MediaElement Source="bgm.mp3" Margin="0,0,0,64" Name="mediaElement1" LoadedBehavior="Manual" UnloadedBehavior="Stop" Stretch="Fill" MediaOpened="mediaElement1_MediaOpened" Visibility="Collapsed" />
CS
mediaElement1.Play();
总结:
方法一:适用于播放简短的音效,特别是调用系统音效超方便。
方法二:如果做Winform的话建议用这个,已经提供了一个播放器的基本功能。
方法三:WPF限定的方法,最便捷省力且可以直接用XAML修改属性,
小丸最终采用了方法一播放音效,方法三播放背景音乐,修改后的抽奖程序源码有人需要的话我再上传。
参考文章:
WPF中播放声音 http://blog.csdn.net/jiminull/article/details/817904
用WPF制作简单的播放器 http://blog.zhigui.org/2011/04/wpf-simple-player/
最后送上琪露诺一只清凉大家的眼睛,各位朋友如果觉得有帮助不要吝啬点击一下推荐哦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!