导出 (0) 打印
全部展开

如何在 Windows Phone 的 Silverlight 应用程序中访问麦克风

2012/2/9

本主题演示如何使用 Microsoft.Xna.Framework.Audio.Microphone 类从 Silverlight 应用程序的 Windows Phone 麦克风获取音频输入。

提示提示:

有关在 Silverlight 应用程序中访问麦克风和播放录制的音频的更多信息,请下载 Silverlight 麦克风示例

重要说明重要说明:

本文需要使用 Windows Phone SDK。请参阅安装 Windows Phone SDK

若要在 Silverlight 中访问 Windows Phone 麦克风,请使用 XNA Framework 中的 Microphone 类。

向 Windows Phone 的 Silverlight 应用程序中添加麦克风支持

  1. 通过选择“文件 | 新建项目”菜单命令来创建一个新项目。

  2. 将显示“新建项目”窗口。展开“Visual C#”模板,然后选择“Silverlight for Windows Phone”模板。

  3. 选择“Windows Phone 应用程序”模板。填写所需的项目名称。

  4. “解决方案资源管理器”中,右键单击“引用”,然后选择“添加引用...”

  5. 从 .NET 组件列表中选择 Microsoft.Xna.Framework,然后单击“确定”按钮。

  6. 如果您看到一个对话框,该对话框警告有关向 Silverlight 程序集添加引用的信息,请单击“是”

  7. 向 MainPage.xaml.cs 文件的顶部添加以下 using 语句:

    using System.IO;
    using System.Windows.Threading;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    
    
  8. 在 MainPage.xaml.cs 中,将变量声明为 MainPage 类的全局成员:

    public partial class MainPage : PhoneApplicationPage
    {
        Microphone microphone = Microphone.Default;
        byte[] buffer;
        MemoryStream stream = new MemoryStream();
        SoundEffect sound; 
        // ...
    
    
  9. 由于我们在 Silverlight 应用程序中使用 XNA Game Studio,因此需要模拟 XNA Game Studio 在正常情况下为我们实现的游戏循环。将以下代码添加到 MainPage 类构造函数中对 InitializeComponent 的调用之后,以模拟 XNA Game Studio 游戏循环:

    // Timer to simulate the XNA Game Studio game loop (Microphone is from XNA Game Studio)
    DispatcherTimer dt = new DispatcherTimer();
    dt.Interval = TimeSpan.FromMilliseconds(50);
    dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
    dt.Start();
    
  10. 向 MainPage 类中添加一个新的 Microphone.BufferReady 事件处理程序:

    microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
    

    变量声明以及完成的构造函数应如下所示:

    public partial class MainPage : PhoneApplicationPage
    {
        Microphone microphone = Microphone.Default;
        byte[] buffer;
        MemoryStream stream = new MemoryStream();
        SoundEffect sound;
    
        // Constructor
        public MainPage()
        {
            InitializeComponent();
    
            // Timer to simulate the XNA Game Studio game loop (Microphone is from XNA Game Studio)
            DispatcherTimer dt = new DispatcherTimer();
            dt.Interval = TimeSpan.FromMilliseconds(33);
            dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
            dt.Start();
    
            microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
        } 
        ...
    
    
  11. 实现 BufferReady 事件处理程序。该处理程序将麦克风的数据复制到缓冲区中并将该缓冲区写入一个流。

    void  microphone_BufferReady(object sender, EventArgs e)
    {
        microphone.GetData(buffer);
        stream.Write(buffer, 0, buffer.Length);
    }
    
  12. 添加用户开始从麦克风捕获音频的方法。录制按钮 Click 事件的该事件处理程序分配一个足够大的缓冲区,可包含 1 秒钟的音频,并通过调用 Microphone.Start 开始收集该数据。

    private void recordButton_Click(object sender, RoutedEventArgs e)
    {
        microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
        buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
        microphone.Start();
    }
    
  13. 添加用户停止从麦克风捕获音频的方法。停止按钮 Click 事件的该事件处理程序检查麦克风当前是否正在收集输入。如果是,则代码会调用 Microphone.Stop 结束录制。

    private void stopButton_Click(object sender, RoutedEventArgs e)
    {
        if (microphone.State == MicrophoneState.Started)
        {
            microphone.Stop();
        }
    }
    
  14. 添加用户播放捕获的音频的方法。播放按钮 Click 事件的该事件处理程序使用其中保存音频数据的流分配一个新的 SoundEffect 对象。然后,该对象调用 SoundEffect.Play 方法。

    private void playButton_Click(object sender, RoutedEventArgs e)
    {
        sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
        sound.Play();
    }
    

这些是使用 XNA Framework 的 Microphone 类在 Windows Phone Silverlight 应用程序中从麦克风收集音频数据所必需的基本步骤。有关更详细的示例(包括如何监视 SoundEffect 何时停止播放),请参阅 Silverlight 麦克风示例

显示:
© 2015 Microsoft