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