День третий. Запись с микрофона

Вступление

Любое устройство на Windows Phone 7 имеет микрофон. Разработчик имеет доступ к API, позволяющий захватывать звук и воспроизводить его. Подобная возможность может стать основой для некоторых типов программ и игр.

Доступ к микрофону

Silverlight не имеет функций для работы с микрофоном, поэтому мы воспользуемся помощью XNA Framework. Создайте новый проект и установите ссылку на Microsoft.Xna.Framework. Вы можете увидеть диалоговое окно с предупреждением, не обращаем внимания и щелкаем кнопку OK.

Добавляем код в программу (файл MainPage.cs)


using System.Windows.Threading;
using Microsoft.Xna.Framework;


// Constructor
public MainPage()
{
    InitializeComponent();

    // Timer to simulate the XNA game loop (Microphone is from XNA)
    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);
}

Напишем обработчик для события BufferReady - мы будем копировать данные, поступающие с микрофона в буфер и записывать их в поток.


void  microphone_BufferReady(object sender, EventArgs e)
{
    microphone.GetData(buffer);
    stream.Write(buffer, 0, buffer.Length);
}

Дадим возможность пользователю записать голос с микрофона. Добавим в приложение кнопку, которая будет выделять буфер для записи данных в течении одной секунды и начнет сохранять полученные данных при помощи Microphone.Start:


private void recordButton_Click(object sender, EventArgs e)
{
    microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
    buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
    microphone.Start();
}

Также надо добавить кнопку для остановки записи при помощи Microphone.Stop, предварительно удостоверившись, что микрофон работает на прием звука.


private void stopButton_Click(object sender, EventArgs e)
{
    if (microphone.State == MicrophoneState.Started)
    {
        microphone.Stop();
    }
}

Неплохо бы воспроизвести записанные звуки или речь. Добавим еще одну кнопку для воспроизведения звуков. Для обработчика события Click выделим объект SoundEffect, который будет использовать поток, где сохранялись наши записи с микрофона. Затем нужно вызвать метод SoundEffect.Play.


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

Мы рассмотрели базовые примеры захвата звуков с микрофона в Silverlight-приложениях при помощи класса Microphone из XNA Framework. Дополнительную информацию можно узнать из специального примера для работы с микрофоном, который включает в себя описание, как следить за окончанием воспроизведения SoundEffect.

Скачать Пример работы с микрофоном

Идея статьи

How to: Access the Microphone in a Silverlight Application for Windows Phone

Смотри также

Chris Craft's Blog - WP7 Dev Tip #018: How to record audio in Windows Phone 7

Реклама