要使用录音功能,首先要在WMAppManifest.xml文件中包含ID_CAP_MICROPHONE。
WP8的Microphone定义在Xna.Framework下,所以要使用麦克风,必须引用Microsoft.Xna.Framework.Audio,XNA框架下会定期的更新游戏界面,但是我们的应用并没有这样的机制,所以要定义一个定时器DispatcherTimer来定时执行FrameworkDispatcher.Update()。
定时器定义:
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(50);
dt.Tick += delegate
{
try
{
FrameworkDispatcher.Update();
}
catch
{
}
};
dt.Start();
1. 定义Microphone:
Microphonemicrophone = Microphone.Default;
2. 设置1S的缓冲区,录音首先保存到缓存中,当缓存的数据大小达到一秒的录音文件大小时将缓存写入流。
microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
3. 定义录音数据接收缓存:
byte[] buffer;
stream = new MemoryStream();
4. 当达到指定时间长度的缓存时,执行下述事件:microphone.BufferReady += microphone_BufferReady;
voidmicrophone_BufferReady(object sender, EventArgs e)
{
microphone.GetData(buffer);
stream.Write(buffer,0, buffer.Length);
}
5. 录音完成后将文件写入独立存储:
IsolatedStorageFileStreammyIO = appFileRecord.CreateFile(“record.wav”);
myIO.Write(stream.ToArray(),0, (int)stream.Length);
myIO.Close();
6. 最后就可以通过各种手段播放音频文件,可以直接用SoundEffect类,也可以将录音文件拷贝到系统播放列表播放。
具体代码如下:
private Microphone microphone = Microphone.Default;
private byte[] buffer;
private MemoryStream stream;
public Record()
{
InitializeComponent();
imageRecord.MouseEnter += imageRecord_MouseEnter;
imageRecord.MouseLeave += imageRecord_MouseLeave;
microphone.BufferReady += microphone_BufferReady;
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(50);
dt.Tick += delegate
{
try
{
FrameworkDispatcher.Update();
}
catch
{
}
};
dt.Start();
}
private void imageRecord_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
stream = new MemoryStream();
StartRecord();
}
private void imageRecord_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
if (microphone.State == MicrophoneState.Started)
{
microphone.Stop();
if (stream.Length > 1024)
{
IsolatedStorageFileStream myIO = appFileRecord.CreateFile("record.wav");
myIO.Write(stream.ToArray(), 0, (int)stream.Length);
myIO.Close();
}
}
}
private void StartRecord()
{
microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
microphone.Start();
}
private void microphone_BufferReady(object sender, EventArgs e)
{
microphone.GetData(buffer);
stream.Write(buffer, 0, buffer.Length);
}