1

私は、ユーザーが話し言葉(wavファイル)を聞いて、その言葉を表す正しい画像を選択する、単純なワンスレッドWindowsフォーム.NET4.5アプリを持っています。

問題は、クリップが時々(非常にまれに-時間の約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);
    }

誰かがこの問題の解決策を提案できますか?たぶん、メソッドの最後でファイルを削除するべきではありませんか?しかし、一時ファイルが山積みになります...

私はWindows7を使用しています...

4

2 に答える 2

1

ファイルが再生されるよりも早く削除されていると思います。

PlayStateChangeイベントをFile.Delete(tempFile);利用する代わりにこれを試すことができますか

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

プレーヤーオブジェクトを長期間保持している場合は、イベントのサブスクライブを解除する必要がある場合があります。

于 2013-03-18T17:04:00.193 に答える
0

私は問題を解決したようです...これを引き起こしたのは実際にはファイルの削除でした...

解決:

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;
}
于 2013-03-18T17:25:50.697 に答える