【问题标题】:AxWindowsMediaPlayer Clip Will Sometimes Not PlayAxWindowsMediaPlayer 剪辑有时无法播放
【发布时间】:2013-03-18 15:17:57
【问题描述】:

我有一个简单的单线程 windows 窗体 .NET 4.5 应用程序,用户在其中听语音(wav 文件),然后选择代表该词的正确图片。

问题是剪辑有时(非常罕见 - 大约 1% 的时间,完全随机)不播放...

这是播放剪辑的方法:

    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...

【问题讨论】:

  • 您必须发布一些您正在使用的代码,以便我们为您提供帮助。

标签: c# .net windows media-player


【解决方案1】:

我猜文件被删除的速度比播放速度快。

你可以试试这个而不是 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;
    }
};

如果您将播放器对象保留很长时间,您可能需要取消订阅该事件。

【讨论】:

  • 我尝试了您的解决方案,但我得到了这个:拒绝访问路径 'C:\\Users\\David\\AppData\\Local\\Temp\\tmp5F17.tmp.wav'。在 File.Delete 行上......不知道为什么......也许该文件仍在播放,因此未释放。如果我使用 12 而不是 1,则文件不会被删除......我下面的解决方案有效,所以我将使用它。无论如何谢谢 - 我没有想到这种可能性 - 也许有可能让它发挥作用..
【解决方案2】:

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

解决方案:

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

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多