成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Windows Phone 播放聲音的方法

移動開發(fā)
本篇文章的主軸會以播放音效為主,使用不同的方法來播放音效有許多不同的注意事項,一不小心應(yīng)用程序就會發(fā)生非預(yù)期例外,在此整理與分享一些使用上的心得筆記。

在以Silverlight為主的Windows Phone 7應(yīng)用程序中播放音效,其實只有幾種方法,若要播放音效檔,比較常見的會用XNA Framework里的SoundEffect或SoundEffectInstance類別來播 放,在者就是用MediaElement來播放較長的音樂或影片,本篇文章的主軸會以播放音效為主。使用不同的方法來播放音效有許多不同的注意事項,一不小心應(yīng)用程序就會發(fā)生非預(yù)期例外,在此整理與分享一些使用上的心得筆記。

由于這兩個類別被編譯在Microsoft.Xna.Framework.dll組件中,因此使用前必須先從專案加入組件參考:

224134ppezthh6m3p63tm1.png

使用時要記得引用Microsoft.Xna.Framework與Microsoft.Xna.Framework.Audio命名空間:

224201c3ewqh5uw0ubzawc.png

由于開發(fā)以Silverlight為基礎(chǔ)的應(yīng)用程序中使用SoundEffect或SoundEffectInstance類別來播放音效僅支援WAV格式 ( *.wav )的聲音檔,所以如果你想播放MP3格式的音效檔的話,必須先透過其他轉(zhuǎn)檔工具先轉(zhuǎn)換成WAV 格式才行,而且WAV 檔的格式還有以下 限制:

必須是PCM wave聲音檔,而且必須為RIFF bitstream格式

只能是mono (單音) 或stereo (立體音) 格式

必須為8-bits 或16-bits 的聲音檔

取樣頻率(Sample rate) 必須介于8,000 Hz 到48,000 Hz 之間

備注 :若要播放非WAV的聲音檔或音樂(例如MP3格式的音樂),可改用 MediaElement 來播放。

接著,確定一下載入到專案里的聲音檔的Build Action設(shè)定為Content

224237h9xi54k4d4gdhde1.png

 

接著就能開始寫Code 了!在此,我們用簡單的代碼來介紹其使用方法:

 

1.播放短時間的音效,適合使用SoundEffect類別來播放

  1. Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");  
  2. SoundEffect effect = SoundEffect.FromStream(stream);  
  3. FrameworkDispatcher.Update();  
  4. effect.Play(); 

如上4行程序碼應(yīng)該很容易理解,第1 行載入聲音檔,第2 行建立SoundEffect 物件,第3 行最重要容后再述,第4 行播放聲音。

 

其中最重要的是第3行的FrameworkDispatcher . Update();語法,在使用SoundEffect播放聲音前,一定要先執(zhí)行這一段語法,否則就會引發(fā)例外!

然而,使用SoundEffect類別來播放有個最明顯的限制 ,那就是開始播放音效后就無法透過程序來設(shè)定停止播放 ,因此直接使用SoundEffect來播放聲音通常會用來播放比較短的音效(例如1 ~ 3秒)。

2.播放連續(xù)的背景音效或較長時間的音效,適合使用SoundEffectInstance類別來播放

  1. Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");  
  2. SoundEffect effect = SoundEffect.FromStream(stream); 
  3. SoundEffectInstance instance = effect.CreateInstance(); 
  4. instance.Play(); 

使用SoundEffectInstance來播放音效前,基本上還是要先取得SoundEffect物件,然后再透過SoundEffect的 CreateInstance來取得一個新的SoundEffectInstance實體, 不需要先執(zhí) 行 FrameworkDispatcher . Update(); 就可以播放聲音 ,而且也能透過其他方法來暫停、繼續(xù)或停止播放音效 ,這是與直 接使用SoundEffect物件來播放聲音時最大的差異。

224406513zswm5ee05iql1.png

另一個與SoundEffect播放音效的差異在于,使用SoundEffectInstance可以設(shè)定「重復(fù)播放音效」功能,這樣的功能可以運用在需要 提供背景環(huán)境音效時使用。 啟用的方法也很簡單,只要在SoundEffectInstance物件上設(shè)定IsLooped屬性為true即可。

2244354yx73vwss4vs0d7i.png

§特別注意§

無論使用SoundEffect或SoundEffectInstance來播放音效,這兩種播放音效的方式有3個非常重要的注意事項,分別說明如下:

1. 這兩個類別來自于XNA Framework,因此只要有用到SoundEffect或SoundEffectInstance的頁面,都要在建構(gòu)子函式 中加上以下程序碼,并且不斷呼叫FrameworkDispatcher . Update();語法,這樣才能讓SoundEffect或 SoundEffectInstance在播放音樂的過程中正確無誤的執(zhí)行,否則很有可能會遇到音效播放到一半就自動停止的情況! ( 更嚴(yán)重者,可能會 導(dǎo)致應(yīng)用程序直接發(fā)生非預(yù)期的例外 )

  1. // Timer to simulate the XNA game loop 
  2. // (SoundEffect classes are from the XNA Framework) 
  3. DispatcherTimer XnaDispatchTimer = new DispatcherTimer(); 
  4. XnaDispatchTimer.Interval = TimeSpan.FromMilliseconds(50); 
  5. // Call FrameworkDispatcher.Update to update the XNA Framework internals. 
  6. XnaDispatchTimer.Tick +=  
  7.         delegate { try { FrameworkDispatcher.Update(); } catch { } }; 
  8. // Start the DispatchTimer running. 
  9. XnaDispatchTimer.Start(); 

2. 這兩個SoundEffect與SoundEffectInstance類別在播放音樂時,其執(zhí)行的方式完全是屬于射后不理 (Fire-and- Forget)型的,所以當(dāng)啟動聲音播放后會自動在背景運作(透過非同步執(zhí)行的方式),因此當(dāng)你希望循序播放兩個聲音檔時,必須小心設(shè)計,絕不能連續(xù)寫在 一起,這樣會導(dǎo)致兩個音效檔同時播放。 你可以透過DispatcherTimer以非同步的方式來判斷前一個聲音檔是否已播放完畢來做到循序播放的目 的,以下是一個簡易的程序碼范例供參考: ( 注: SoundEffect 與 SoundEffectInstance 都沒有事件可用 )

  1. bool isSound1_Played = false
  2. bool isSound2_Played = false
  3. void dt_Tick(object sender, EventArgs e) 
  4.     if (false == isSound1_Played) 
  5.     { 
  6.         SoundEffect SoundSmall = SoundEffect.FromStream(TitleContainer.OpenStream("Audio/a1.wav")); 
  7.         soundInstance = SoundSmall.CreateInstance(); 
  8.         soundInstance.IsLooped = false
  9.         soundInstance.Play(); 
  10.         isSound1_Played = true
  11.     } 
  12.     else if (false == isSound2_Played && soundInstance.State == SoundState.Stopped) 
  13.     { 
  14.         SoundEffect sound = SoundEffect.FromStream(TitleContainer.OpenStream("Audio/a2.wav")); 
  15.         soundInstance = sound.CreateInstance(); 
  16.         soundInstance.IsLooped = true
  17.         soundInstance.Play(); 
  18.         isSound2_Played = true
  19.     } 

3. 也由于SoundEffectInstance類別射后不理 (Fire-and-Forget)的特性,所以請務(wù)必確認(rèn)在從頁面離開時,必須將 DispatcherTimer與SoundEffectInstance物件都設(shè)定停止,否則音樂即便到了下一頁還是會繼續(xù)播放的!

  1. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
  2.     base.OnNavigatedFrom(e); 
  3.     dt.Stop(); // Stop the DispatcherTimer 
  4.     soundInstance.Stop(); 

最后,我推薦各位可以下載AppHub上官方提供的Silverlight Sound Sample | Windows Phone范例,里面有些程序 碼可以參考使用,以下節(jié)錄LoadSound與LoadSoundInstance這兩個好用的Method給各位參考:

  1. /// <summary> 
  2. /// Loads a wav file into an XNA Framework SoundEffect. 
  3. /// </summary> 
  4. /// <param name="SoundFilePath">Relative path to the wav file.</param> 
  5. /// <param name="Sound">The SoundEffect to load the audio into.</param> 
  6. private void LoadSound(String SoundFilePath, out SoundEffect Sound) 
  7.     // For error checking, assume we'll fail to load the file. 
  8.     Sound = null
  9.     try 
  10.     { 
  11.         // Holds informations about a file stream. 
  12.         StreamResourceInfo SoundFileInfo = App.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative)); 
  13.         // Create the SoundEffect from the Stream 
  14.         Sound = SoundEffect.FromStream(SoundFileInfo.Stream); 
  15.     } 
  16.     catch (NullReferenceException) 
  17.     { 
  18.         // Display an error message 
  19.         MessageBox.Show("Couldn't load sound " + SoundFilePath); 
  20.     } 
  21. /// <summary> 
  22. /// Loads a wav file into an XNA Framework SoundEffect. 
  23. /// Then, creates a SoundEffectInstance from the SoundEffect. 
  24. /// </summary> 
  25. /// <param name="SoundFilePath">Relative path to the wav file.</param> 
  26. /// <param name="Sound">The SoundEffect to load the audio into.</param> 
  27. /// <param name="SoundInstance">The SoundEffectInstance to create from Sound.</param> 
  28. private void LoadSoundInstance(String SoundFilePath, out SoundEffect Sound, out SoundEffectInstance SoundInstance) 
  29.     // For error checking, assume we'll fail to load the file. 
  30.     Sound = null
  31.     SoundInstance = null
  32.     try 
  33.     { 
  34.         LoadSound(SoundFilePath, out Sound); 
  35.         SoundInstance = Sound.CreateInstance(); 
  36.     } 
  37.     catch (NullReferenceException) 
  38.     { 
  39.         // Display an error message 
  40.         MessageBox.Show("Couldn't load sound instance " + SoundFilePath); 
  41.     } 
責(zé)任編輯:閆佳明 來源: wpcome
相關(guān)推薦

2012-12-27 14:29:38

Android開發(fā)流媒體

2009-09-22 14:20:39

C#播放聲音

2011-07-22 15:59:15

iPhone 聲音 文件

2010-01-11 17:30:40

VB.NET播放聲音

2013-04-08 09:31:05

iOS開發(fā)系統(tǒng)聲音服務(wù)

2009-04-22 08:57:25

Windows 7微軟操作系統(tǒng)

2018-08-17 22:00:22

Linux輸出設(shè)備音頻

2018-08-16 14:40:53

Linux輸出設(shè)備播放聲音

2012-04-19 08:42:22

春Phone沙龍

2011-11-03 15:55:40

Windows Pho

2012-05-27 20:12:30

Windows Pho

2022-06-01 08:21:24

Java內(nèi)存API

2013-07-05 15:05:42

Windows PhoWP頁面間傳值方法

2012-01-18 09:22:59

Windows Pho設(shè)計過程

2013-04-09 12:59:21

WindowsPhon

2010-12-01 13:40:13

樞軸控件Windows Pho

2013-06-26 13:25:01

WindowsWindows Pho

2013-07-30 12:37:56

Windows PhoWindows Pho

2010-10-11 14:42:49

Windows Pho

2010-12-01 13:55:29

地圖插件Windows Pho
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久精品亚洲成在人线av网址 | 草逼网站| 久久蜜桃精品 | 日日欧美 | 欧美精品一区二区在线观看 | 在线日韩中文字幕 | 爱爱免费视频网站 | 亚洲成人久久久 | 草久久| 成年人在线观看 | 久久久久久国模大尺度人体 | 一区二区三区视频在线 | 男人的天堂avav | 欧美日韩国产一区二区 | a视频在线观看 | 欧美一区二区在线播放 | 国产视频导航 | 午夜精 | 天天射美女 | 日韩免费av| 成人免费小视频 | 午夜男人免费视频 | 中文字幕亚洲一区二区va在线 | 日本一区二区影视 | 国产在线精品一区二区三区 | 欧美网站一区 | 欧美一区二区三区视频在线观看 | 老妇激情毛片免费 | 欧美精品在线一区二区三区 | 中文精品视频 | 一级黄色片一级黄色片 | 九九九视频在线观看 | 97超碰人人草 | heyzo在线| 国产成人免费视频网站高清观看视频 | 欧美激情视频一区二区三区免费 | 天堂久 | 日韩高清一区 | 欧美精品一区在线 | 成人福利片 | 91久久精品 |