2015-04-04 59 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