在做一個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();}
這裡就不給具體的專案檔下載了,大家可以親自動手驗證下。