방법: Windows Phone용 Silverlight 응용프로그램에서 마이크 액세스

2012-02-09

이 항목은 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# 템플릿을 확장하고 Windows Phone용 Silverlight 템플릿을 선택합니다.

  3. Windows Phone 응용프로그램 템플릿을 선택합니다. 프로젝트 이름을 원하는 대로 입력합니다.

  4. 솔루션 탐색기에서 참조를 마우스 오른쪽 버튼으로 클릭하고 참조 추가...를 선택합니다.

  5. .NET 구성 요소 목록에서 Microsoft.Xna.Framework를 선택하고 확인 버튼을 클릭합니다.

  6. Silverlight 어셈블리에 참조를 추가하는 것에 대한 경고 대화 상자가 표시되면 버튼을 클릭합니다.

  7. 다음 using 문을 MainPage.xaml.cs 파일의 맨 위에 추가합니다.

    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가 일반적으로 구현하는 Game 루프를 시뮬레이션해야 합니다. XNA Game Studio 게임 루프를 시뮬레이션하기 위해 InitializeComponent 호출 후 MainPage 클래스의 생성자에 다음 코드를 추가합니다.

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

이 과정은 XNA 프레임워크의 Microphone 클래스를 사용하여 Windows Phone Silverlight 응용프로그램에서 마이크의 오디오 데이터를 수집하는 데 필요한 기본 단계입니다. SoundEffect가 재생을 중지할 때의 모니터링 방법을 비롯한 더 자세한 예제는 Silverlight Microphone 샘플을 참조하십시오.

표시: