2015-04-04 54 views
0

我正在使用AudioVideoCaptureDevice錄製麥克風的某些聲音。我想給用戶反饋他錄製的內容,所以我希望能夠播放它。Windows Phone:播放錄製的聲音會引發異常

把聲音當成歌,並通過Microsoft.Xna.Framework.Media.MediaPlayer玩它,我得到一個異常:

{System.InvalidOperationException:樂曲播放失敗。 請確認歌曲不受DRM保護。 創作者遊戲不支持受DRM保護的歌曲。 ---> System.InvalidOperationException:發生意外錯誤。 ---在Microsoft.Xna.Framework.Media.MediaQueue.Play(宋歌)}

展望歌在手錶的細節,IsProtected()內部異常堆棧跟蹤--- 結束似乎會導致問題。 (如果播放正常,我可以正確地知道歌曲沒有被保護。)我使用的是AAC和ACM編解碼器,兩者都給出了相同的結果。

我可以在關閉並再次打開視圖後播放歌曲,但尚未找到任何可解釋此問題的相關初始化。

我也嘗試複製該文件,以防某些進程仍然持有鎖,仍然沒有改進,與隔離存儲相同。

在未關閉應用程序但重新進入視圖後,歌曲播放沒有問題。

如何直接播放錄製的音頻沒有任何問題?

+0

任何代碼來顯示的答案? – MickyD 2015-04-05 03:20:30

+0

謝謝,我找到了答案,並且還發布了我在答案中更改/添加的代碼。 – 2015-04-07 16:34:59

回答

0

我使用了http://independentinnovation.net/blogs/independentinnovation/archive/2012/12/11/Windows-Phone-8-Audio-Recording-using-Windows.Phone.Media.Capture.aspx的AudioRecorder示例。 (注意:現在這個鏈接不工作,域名過期..無論如何,我用別人的代碼。)

事實證明,在Record()函數中,打開一個流,在Stop ()函數永遠不會正確刷新和處理。

我不明白這可能會導致問題,因爲我拷貝了結果文件,只是爲了確保所有句柄都是有效的。

儘管如此,舊的處理方式肯定是錯誤的,新的處理更加清潔,而且,順便說一句,工作。

public async void StopRecording() 
    { 
     try 
     { 
      if (dev != null) 
      { 
       await dev.StopRecordingAsync(); 
       dev = null; 
       // these 2 lines I had to add 
       await recordingStream.FlushAsync(); 
       recordingStream.Dispose(); 
      } 
      var length = new System.IO.FileInfo(fileName).Length; 
      System.Diagnostics.Debug.WriteLine("Recorded " + fileName + " with length " + length); 
     } 
     catch (System.Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 
     } 
    } 

編輯:給予學分,我發現我這裏使用的http://www.postseek.com/meta/9fddd403d0cde523a542be42b7a4b057

+1

我假設大部分是他們的代碼。考慮將'recordingStream'設置爲'null',以避免意外使用處置對象。 – MickyD 2015-04-08 01:06:09