我希望有人可以帮助我。我找到了在Silverlight应用程序中使用XNA录制音频的示例。然而,它只是第一次使用。我在单独的WP7页面上拥有所有录制功能,并且连续访问该页面它不起作用。我能说的最好的是麦克风。开始调用,但micophone.status仍然停止。奇怪的是,BufferReady不断被调用,并且该函数中的代码全部正在运行但没有麦克风真正开始什么都没发生。退出应用程序并在第一次访问该页面时再次返回并且一切正常,但重新访问该页面却没有。
void microphone_BufferReady(object sender, EventArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
microphone.GetData(buffer);
stream.Write(buffer, 0, buffer.Length);
TimeSpan tsTemp = timer.Elapsed;
TextBlockSeconds.Text = tsTemp.Hours.ToString().PadLeft(2, '0') + ":" + tsTemp.Minutes.ToString().PadLeft(2, '0') + ":" + tsTemp.Seconds.ToString().PadLeft(2, '0');
if(timer.Elapsed.Seconds >5)
DoStop();
});
}
private void ButtonRecord_Click(object sender, RoutedEventArgs e)
{
DisableRecordButton();
timer = new Stopwatch();
timer.Start();
stream = new MemoryStream();
TextBlockSeconds.Text = "00:00:00";
TextBlockStatus.Text = "Recording: ";
microphone.BufferDuration = TimeSpan.FromMilliseconds(500);
buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
microphone.Start();
}
private void DoStop()
{
if (timer.IsRunning)
timer.Stop();
if (microphone.State == MicrophoneState.Started)
{
microphone.Stop();
TextBlockStatus.Text = "Stopped: Ready to save";
}
else
{
TextBlockStatus.Text = "Ready: ";
}
TextBlockSeconds.Text = string.Empty;
EnableRecordButton();
}
...更新 我发现问题但没有解决方案。我通过计时器上的代码调用麦克风。停止(因此我可以将录制的音频限制为5秒)。单击手动停止按钮时执行的代码完全相同。单击手动停止按钮一切正常,可以重新访问页面,一切都会好的。当从计时器的代码中调用停止时,下一次访问页面将不起作用。所以我只用一个手动停止按钮实现它,但真的很自然地做它(并知道真正的问题是什么)。
答案 0 :(得分:2)
实际上,当您离开页面时,您可以添加
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.MicroPhone.BufferReady -= this.Microphone_BufferReady;
}
当您返回页面添加
时this.MicroPhone.BufferReady += this.Microphone_BufferReady;
您可以在页面加载的事件或OnNavigatedTo事件
中添加此语句答案 1 :(得分:1)
添加了字符串名称= System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()以确保它位于同一个线程上(并且它是)。
但终于解决了这个问题,问题是麦克风.stop不会阻止麦克风继续触发缓冲区就绪事件(就像我期待的那样)。这似乎是页面缓存的方式,这会导致该事件仍在触发时出现一些奇怪的问题。所以我添加了代码
microphone.BufferReady -= new EventHandler<EventArgs>(microphone_BufferReady);
到我的停止代码,现在一切正常。
答案 2 :(得分:0)
如果您离开页面并且不手动停止,我无法从您的代码中看到您是如何停止计时器/麦克风的。
如果不是这样,您是否确保在同一个线程上执行所有麦克风操作? (只是一个想法。)