エクスポート (0) 印刷
すべて展開

方法: Windows Phone 用の Silverlight アプリケーションでマイクにアクセスする

2012/02/09

このトピックでは、Silverlight アプリケーションで Microsoft.Xna.Framework.Audio.Microphone クラスを使用して 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] を選択して [OK] をクリックします。

  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. このトピックで説明する手順では、XNA Game Studio を Silverlight アプリケーションの中で使用しようとしているので、ゲーム ループをシミュレートする必要があります (本来であれば 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 のための Silverlight アプリケーションで XNA Framework の Microphone クラスを使用してマイクからオーディオ データを収集するために必要な、基本的手順を説明しました。より詳細な例については、Silverlight マイク サンプルを参照してください。このサンプルには、SoundEffect による再生がいつ停止するかを監視する方法も含まれています。

表示:
© 2015 Microsoft