單位近日要辦一個歌唱比賽,小丸被委托開發一個隨機選人的小工具,想到之前在園子里收藏過一篇《年終了,大家年會有抽獎不?共享個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/
最后送上琪露諾一只清涼大家的眼睛,各位朋友如果覺得有幫助不要吝嗇點擊一下推薦哦~