Windows Phone アプリのマイクにアクセスする方法

2013/12/05

このトピックでは、Windows Phone アプリで Microsoft.Xna.Framework.Audio.Microphone クラスを使用して Windows Phone のマイクからオーディオ入力を取り込む方法を説明します。

メモメモ:

multiple devices 7x27a プロセッサでは、FM ラジオとマイクに同時にアクセスすることはできません。

ヒントヒント:

Windows Phone アプリでマイクにアクセスする方法、および録音された音声を再生する方法の詳細については、「Microphone Sample」をダウンロードしてください。

Windows Phone のマイクから入力をキャプチャするには、XNA Framework の Microphone クラスを使用します。

Windows Phone アプリにマイクのサポートを追加するには

  1. [ファイル] メニューの [新しいプロジェクト] をクリックして、新しいプロジェクトを作成します。

  2. [新しいプロジェクト] ウィンドウが表示されます。[Visual C#] のテンプレートを展開してから、Windows Phone のテンプレートを選択します。

  3. [Windows Phone アプリ ] テンプレートを選択します。任意のプロジェクト名を入力します。

  4. ソリューション エクスプローラーで、[参照] を右クリックし、[参照の追加] を選択します。

  5. .NET コンポーネントのリストから [Microsoft.Xna.Framework] を選択して [OK] をクリックします。

  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. このトピックで説明する手順では、XNA Game Studio を Windows Phone アプリの中で使用しようとしているので、ゲーム ループ をシミュレートする必要があります (本来であれば 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. 新しい Microphone.BufferReady イベント ハンドラーを、MainPage クラスのコンストラクターに追加します。

    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();
    }
    

このトピックでは、Windows Phone アプリで XNA Framework の Microphone クラスを使用してマイクからオーディオ データを収集するために必要とされる基本的な手順を説明しました。SoundEffect による再生がいつ停止するかを監視する方法を含め、より詳細な例については、「Microphone Sample」を参照してください。

表示:
© 2014 Microsoft