Windows Phone 7 Silverlight程序中声音播放实现

在做一个WP7的Silverlight项目时,需要实现使用声音的播放,我参考了很多开源的项目,发现它们实现这个功能时都引用一个属于XNA框架的DLL,这一点当初觉得非常奇怪,为此我也就照葫芦画瓢实现了。本人还自我良好地认为WP7上的Silverlight框架本身是不具备声音播放的功能,考虑到避免在XNA和SL上重复地实现两个声音播放的库,WP7的开发人员将声音的播放接口只封装在XNA中。后来发现我想当然了。


现在我来先讲一下如何在Silverlight程序中使用XNA接口实现声音的播放,首先我们需要在项目中添加Microsoft.Xna.Framework.dll的引用。


在添加完引用后,接下来在代码文件上方使用using添加下面两个命名空间:

 

using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework;

 

该类只支持WAV文件,如果你是声音文件是.mp3格式的话,你需要使用一个转换工具将其转换为WAV的格式。网络上很多这样的免费工具,这里就不多叙了。

 

接下来将WAV音频文件添加到项目。我们可以使用TitleContainer.OpenStream()方法将WAV文件转换为一个Stream对象。而后在使用前面的Stream对象创建一个SoundEffect对象即可实现声音的播放了。代码如下:

 

Stream stream = TitleContainer.OpenStream("sounds/crickets.wav");SoundEffect effect = SoundEffect.FromStream(stream);FrameworkDispatcher.Update();effect.Play();


通常情况下,一个格式为WAV的文件要比压缩过的.mp3文件大的多。其实在WP7的Silverlight框架上是存在一种播放音频文件的接口的,这就是MediaElement。一旦你创建好了一个MediaElement对象,请确保该对象已经被添加到Silverlight树中。如果MediaElement不是静态声明的话,mp3文件将不会被加载。


此外,当你通过VS2010和Zune Software部署包含MediaElement的程序到真实设备上时,如果在播放音频文件前就没有断开手机和Zune Software间的连接,那么很不幸,应用程序在加载音频文件时会报错。但是在模拟器上运行该程序则一切正常。


下面的代码将使用MediaElement来演示如何实现声音的播放:

MainPage.xaml:

 

<MediaElement x:Name="MainME" AutoPlay="False" MediaOpened="MainME_MediaOpened" MediaFailed="MainME_MediaFailed"></MediaElement>

 

MainPage.xaml.cs:

 

private void SoundBtn_Click(object sender, RoutedEventArgs e){    MainME.Source = new Uri("sounds/mySound.mp3", UriKind.Relative);    MainME.Position = new TimeSpan(0);}

 

private void MainME_MediaOpened(object sender, RoutedEventArgs e){    MainME.Play();}

 

这里就不给具体的项目文件下载了,大家可以亲自动手验证下。

 

posted @ 2010-12-23 08:48  軒轅  阅读(1654)  评论(1编辑  收藏  举报