×
Namespaces

Variants
Actions

如何在WP7上录制音频

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon Multimedia.png
SignpostIcon XAML 40.png
SignpostIcon WP7 70px.png
Article Metadata

兼容于
文章
WS_YiLunLuo 在 19 Dec 2011 创建
最后由 hamishwillee 在 17 Jul 2013 编辑

这篇文章展示了如何在Windows Phone 7上录制音频。

Contents

简介

通过windows phone设备的麦克风来录制音频是非常容易的。Microsoft.Xna.Framework.Audio.Microphone支持这项功能:

  1. Start-从话筒中捕捉音频
  2. Stop-停止从话筒中捕捉音频
  3. GetData-将数据从话筒中转换到缓冲区中

下面的示例代码假设在应用程序网页上有三个按钮- start, stop和 play。

参考和初始化

在Silverlight应用程序中使用话筒,我们提到了Microsoft.Xna.Framework,我们将它们加入到 应用程序网页中来实施录制。

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

并声明下面这些变量:

Microphone microphone = Microphone.Default;
byte[] buffer;
MemoryStream stream = new MemoryStream();
SoundEffect sound;

开始录制

下面这些代码显示了如何使用话筒来录制音频:

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

停止录制

停止录制音频的代码:

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

捕获缓存区中的记录

为了捕获缓存区中的记录,我们需要在页面中的构造函数里添加事件处理程序。

microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);

并使用下面的event handler 代码

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

播放录制的音频

在录制完成后进行播放

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

最后但并非不重要

为了使我们上述所介绍的代码能够运行,我们需要做更多的工作,当我们在Silverlight应用程序中使用XNA Game Studio,我们就需要模拟Game循环来使我们的程序能够正常的实施。 定义下面的App.class XNAAsyncDispatcher类并将它添加到App()构造函数的下一行。

ApplicationLifetimeObjects.Add(new XNAAsyncDispatcher(TimeSpan.FromMilliseconds(50)));
public class XNAAsyncDispatcher : IApplicationService
{
private DispatcherTimer _frameworkDispatcherTimer;
public XNAAsyncDispatcher(System.TimeSpan dispatchInterval)
{
FrameworkDispatcher.Update();
this._frameworkDispatcherTimer = new DispatcherTimer();
this._frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick);
this._frameworkDispatcherTimer.Interval = dispatchInterval;
}
void IApplicationService.StartService(ApplicationServiceContext context)
{
this._frameworkDispatcherTimer.Start();
}
 
void IApplicationService.StopService()
{
this._frameworkDispatcherTimer.Stop();
}
 
void frameworkDispatcherTimer_Tick(object sender, EventArgs e)
{
FrameworkDispatcher.Update();
}
}
This page was last modified on 17 July 2013, at 08:09.
68 page views in the last 30 days.