AxWindowsMediaPlayer剪辑有时候不会播放

问题描述:

我有一个简单的单线程窗体.NET 4.5应用程序,用户在听用户说话的话(wav文件),然后选择正确的图片来表示这个词。AxWindowsMediaPlayer剪辑有时候不会播放

的问题是,剪辑有时会(非常少见的 - 的时间约1%completelly随机)不能玩...

用于播放剪辑的方法:

public static void PlayWordAudio(Word word, AxWMPLib.AxWindowsMediaPlayer player) 
    { 
     string tempFile = Path.GetTempFileName() + ".wav"; 

     MemoryStream stream = new MemoryStream(word.Audio); 

     using (Stream fileStream = File.OpenWrite(tempFile)) 
     { 
      stream.WriteTo(fileStream); 
     } 

     player.URL = tempFile; 

     File.Delete(tempFile); 
    } 

有人可以建议解决这个问题?也许我不应该在方法结尾删除文件?但后来临时文件就会堆积起来......

我在Windows 7上......

+0

你必须张贴一些代码你正在使用,以便我们帮助你。 – fmendez 2013-03-18 15:29:42

看来我解决了这个问题......它实际上是导致此文件的删除...

解决方案:

public static void PlayWordAudio(Word word, AxWMPLib.AxWindowsMediaPlayer player) 
    { 
     string tempFile = Path.GetTempFileName() + ".wav"; 

     MemoryStream stream = new MemoryStream(word.Audio); 

     using (Stream fileStream = File.OpenWrite(tempFile)) 
     { 
      stream.WriteTo(fileStream); 
     } 

     player.URL = tempFile; 

     RunDelayed(5000, File.Delete, tempFile); //if we delete file immediately then clip sometimes would not be played 
    }   

    public delegate void DelayedFuncion(string param); 

    public static void RunDelayed(int delay, DelayedFuncion function, string param = null) 
    { 
     System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 

     DelayedArgs args = new DelayedArgs() { delayedFunction = function, param = param }; 
     timer.Tag = args; 
     timer.Tick += TimerElapsed;    
     timer.Interval = delay; 

     timer.Start(); 
    } 

    private static void TimerElapsed(object sender, EventArgs e) 
    { 
     System.Windows.Forms.Timer timer = sender as System.Windows.Forms.Timer; 
     timer.Stop(); 
     DelayedArgs args = timer.Tag as DelayedArgs; 
     args.delayedFunction(args.param); 
    } 


    class DelayedArgs 
{ 
    public Util.DelayedFuncion delayedFunction; 
    public string param; 
} 

我猜的文件被删除的速度比它可以得到发挥。

你能在File.Delete(tempFile);代替尝试这种利用PlayStateChange事件

player.PlayStateChange += (snd, psce) => { 
    switch (psce.newState) 
    { 
     case 1: // Stopped (maybe use 12 => Last) 
      File.Delete(tempFile); 
      break; 
     default: 
      Debug.WriteLine(psce.newState); 
      break; 
    } 
}; 

你可能有,如果你保持玩家对象周围很长一段时间退订事件。

+0

我试过你的解决方案,但我得到了:访问路径'C:\\ Users \\ David \\ AppData \\ Local \\ Temp \\ tmp5F17.tmp.wav'被拒绝。在File.Delete行...不知道为什么..也许该文件仍然播放,因此不释放。如果我使用12而不是1,这些文件不会被删除......我的解决方案如下,我只是用它。 Thanx无论如何 - 我没有想到这种可能性 - 也许有可能使它工作.. – davidhq 2013-03-19 16:32:13