音乐之声 .NET Framework 2.0播放音乐

基于http://msdn.microsoft.com/en-us/magazine/cc163672.aspx与MSDN

你强烈地希望把你的应用程序的闪屏加上令人激动的“Funky Cold Medina”(为了让你们之中不是80后的人听懂,我解释一下这是Tone Loc的歌)。在Visual Studio 2005之前,即使在你的应用程序中加入最简单的曲调和系统声音也是一个很大的挑战。但Microsoft .NET Framework 2.0中添加了很多新的类与新的命名空间来帮助你实现。我们在这次就来看一下其中的一个:System.Media命名空间。

我们首先从一个60年代的简单的鸣响开始。之需要简单的使用SystemSound类就可以做到。SystemSound类包含五个公共属性: Asterisk, Beep, Exclamation, Hand,和 Question。每个属性返回一种类型的系统声音,并暴露了一个Play方法。所以要让计算机鸣响,使用System.Media.SystemSounds.Beep.Play。(说是这么说,但我尝试了一下至少在Win7里是没法出声音的。。。应该是API太古老的原因吧。。。)

要播放更复杂一点的声音?在System.Media命名空间内,你可以找到一个SoundPlayer类来控制.wav文件的回放。SoundPlayer支持播放来自文件/URL/流或一个内嵌的WAV资源。

要播放一个文件,第一步是加载。如果你是从流或URL来播放,需要明确地加载这个文件。如果你是播放内嵌的资源或文件,使用Play方法就会去加载文件。和许多其他.NET的方面一样,你需要可以有两种选择:同步加载或异步加载。这取决于你的应用程序的需求。

如果你加载了wav文件后会马上播放,而且你不能确定文件在你调用Play方法的时候保证被加载,你应该选用同步方式。这种方法的确定是你会阻止你的应用程序在主线程上的其他进一步的行动,在加载阶段锁住了用户界面。

异步方式对于你加载一个较慢的资源比较有效,诸如你从URL打开,或你有一个庞大的文件。你应该在你的程序执行早期调用异步加载方法。不像同步方法,异步方法允许应用程序代码在你的文件被加载的同时继续执行。当文件被加载完毕后你会收到LoadCompleted事件,然后你可以进行你想要做的额外的处理或其他操作。此外,你在任何时候查看IsLoadCompleted属性,来判断加载的状态。这种方法的劣势在于获取事件需要更多的代码,使你的代码稍微复杂一点。

异步范例:

SoundPlayer player=new SoundPlayer();
player.SoundLocation 
= @"F:\\th.wav";
player.LoadAsync();
player.Play();

如果要循环播放就:
player.PlayLooping();

但是鸣响或播放wav文件很难完全满足你的需求。如果你不止想播放wav文件,就需要跳出.NET Framework。一个选择是使用Windows Media Player(你可以从http://download.microsoft.com/download/A/7/E/A7E58606-58A3-429B-AFC0-50159DB5BC13/WMPlayer10SDK.exe下载播放器SDK)。装了SDK,添加对于WMP库的引用,你就能访问更加主流的文件格式,包括mp3和wma。

使用WMP播放文件也非常简单:

wmpplayer.URL = @"F:\\miko.mp3";
wmpplayer.controls.play();
Console.Read();

另外比较有用的是以下两个事件:

Player.PlayStateChange += 
        
new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChange);
Player.MediaError 
+= 
        
new WMPLib._WMPOCXEvents_MediaErrorEventHandler(Player_MediaError);

private void Player_PlayStateChange(int NewState)
{
    
if ((WMPLib.WMPPlayState)NewState == WMPLib.WMPPlayState.wmppsStopped)
    {
        
this.Close();
        
//因为没有直接的playloop方法,如果要循环播放这里需要改为wmpplayer.controls.play();
    }
}

private void Player_MediaError(object pMediaObject)
{
    MessageBox.Show(
"Cannot play media file.");
    
this.Close();
}

原文地址:https://www.cnblogs.com/galaxyyao/p/1577410.html