Windows Phone 提供的訪問麥克風的類爲 Microsoft.Xna.Framework.Audio.Microphone ,該類屬於 XNA Framework , 若要在 Silverlight 中訪問 Windows Phone 麥克風,一樣須要使用此類。因此須要添加引用 Microsoft.Xna.Framework。
1.聲明局部變量,獲取麥克風單例。html
//麥克單例 private Microphone microphone = Microphone.Default; //每次捕獲音頻緩存 private byte[] buf; //音頻流存儲區 private MemoryStream audioStream;
2.因爲在XNA中每33fp就會更新畫面一次,但在Silverlight Application並無這樣的機制,爲了確保錄音的功能持續的更新狀態與進行擷取動做,所以,須要透過指定一個按期執行 FrameworkDispatcher.Update() 的事件。緩存
//設置定時器 DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(33); timer.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; timer.Start();
3.設置錄音相關信息,啓動錄音。ui
//設置1秒的緩存區,沒獲取1秒音頻就會調用一次BufferReady事件 microphone.BufferDuration = TimeSpan.FromMilliseconds(1000); //分配1秒音頻所須要的緩存區 buf = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; audioStream = new MemoryStream(); //BufferReady事件 microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady); //啓動錄音 microphone.Start();
3.實現 BufferReady 事件處理程序。該處理程序將麥克風的數據複製到緩衝區中並將該緩衝區寫入一個流。spa
void microphone_BufferReady(object sender, EventArgs e) { //將麥克風的數據複製到緩衝區中 microphone.GetData(buf); //將該緩衝區寫入一個流 audioStream.Write(buf, 0, buf.Length); }
4.中止錄音code
//中止錄音 microphone.Stop(); microphone.BufferReady -= new EventHandler<EventArgs>(microphone_BufferReady); audioStream.Flush(); //將數據流轉換爲byte,recording中即爲音頻數據 byte[] recording = audioStream.ToArray(); audioStream.Dispose();
5.播放錄音htm
//播放錄音 SoundEffect sound = new SoundEffect(audioStream.ToArray(), microphone.SampleRate, AudioChannels.Mono); sound.Play();
經過錄制的byte字節流數據,能夠經過SoundEffect類播放,至關容易。可是若是想經過其餘方式播放或在要處處音頻數據,則須要將音頻數據以文件的方式保存到獨立存儲中。關於錄製音頻的保存將在後續介紹。blog