MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

如何访问 Windows Phone 8 的麦克风

2014/6/18

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

说明注意:

multiple devices 7x27a 处理器不允许同时访问 FM 收音机和麦克风。

提示提示:

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

要从 Windows Phone 麦克风捕获输入,请使用 XNA Framework 中的 Microphone 类。

向 Windows Phone 应用添加麦克风支持的步骤

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

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

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

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

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

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

  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. 由于我们在 Windows Phone 应用中使用 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 应用中从麦克风收集音频数据所需的基本步骤。有关更详细的示例(包括如何监视 SoundEffect 何时停止播放),请参见麦克风示例

显示:
© 2016 Microsoft