2010-12-06 127 views
2

我希望有人能幫助我解決這個問題。我已經找到了在Silverlight應用程序中使用XNA錄製音頻的例子。然而,它只能在第一次使用。我將所有錄製功能放在單獨的WP7頁面上,並且連續訪問該頁面不起作用。我能告訴的最好的是麥克風。開始播放,但micophone.status仍然停止。有什麼奇怪的是BufferReady一直在調用,並且該函數中的代碼都在運行,但沒有麥克風真正開始沒有真正發生。當你第一次訪問該頁面時,當你退出應用程序並再次返回時,一切正常,但是重新訪問該頁面並且不會。Windows Phone 7音頻錄製問題

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

更新... 我發現問題,但沒有解決方案。我通過定時器上的代碼呼叫microphone.stop(因此我可以將錄製的音頻限制在5秒鐘內)。當點擊手動停止按鈕時,執行完全相同的代碼。當點擊手動停止按鈕一切正常,可以重新訪問該頁面,一切都會好起來的。當停止在計時器的代碼中被調用時,下次訪問該頁面將不起作用。所以我只用一個手動停止按鈕來實現它,但真的很高興自動完成它(並知道真正的問題是什麼)。

+1

請發佈您的代碼,以便我們可以看到您在做什麼。 – 2010-12-06 22:54:29

回答

0

我無法從您的代碼中看到,如果您離開頁面並且不要手動停止它,您將如何停止計時器/麥克風。

如果不是這樣,你是否確保所有的麥克風操作都在同一個線程上執行? (只是一個想法。)

+0

我只是在導航離開頁面之前一直進行麥克風停止測試(當有人在錄製過程中可能會碰到後退按鈕時,忘記加入)。我試圖確保所有的micorphone操作都與這個.Dispatcher.BeginInvoke在同一個線程上,或者有另一種方式我應該這樣做?但同樣的問題,單擊按鈕正常工作,調用代碼只能在第一次工作。 – Jeremy 2010-12-07 16:58:40

1

添加字符串名稱= System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(),以確保它在同一個線程(和它是)。

但終於解決了這個問題,問題是麥克風。停止不停止麥克風繼續觸發緩衝區就緒事件(就像我期待的那樣)。看起來頁面被緩存的方式會導致一些奇怪的問題發生。所以我添加了代碼

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

我的代碼停止,現在所有的工作。

+0

我添加相同的問題,記錄和更改頁面。現在當我做 - =事件時,它正在工作!謝謝 – NicoMinsk 2012-04-10 15:13:28

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事件

+0

感謝分享!我遇到了同樣的問題,但知道我解決了它:) – Icarus 2012-12-31 00:05:38