如何在指定的时间内播放音乐文件

本文关键字:播放 音乐 文件 时间 | 更新日期: 2023-09-27 18:17:57

我要做的是播放指定持续时间的音乐文件,然后停止播放。但是,整个音乐文件正在被播放。什么好主意吗?

我试着开始一个新的线程,仍然不工作

如何在指定的时间内播放音乐文件

问题是PlaySync阻塞线程,所以其他消息不会被处理。这包括来自Tick事件的停止命令。您必须使用常规的Play函数,它将是异步的,并创建一个新线程来播放文件。您必须根据应用程序的工作方式来处理由此产生的多线程情况。

我会构建类似这样的东西:它只是在编辑窗口中手写的,所以不要期望它像那样编译。这只是为了说明这个想法。

internal class MusicPlayer
{
    private const int duration = 1000;
    private Queue<string> queue;
    private SoundPlayer soundPlayer;
    private Timer timer;
    public MusicPlayer(params object[] filenames)
    {
        this.queue = new Queue<string>();
        foreach (var filenameObject in filenames)
        {
            var filename = filenameObject.ToString();
            if (File.Exists(filename))
            {
                this.queue.Enqueue(filename);
            }
        }
        this.soundPlayer = new SoundPlayer();
        this.timer = new Timer();
        timer.Elapsed += new System.Timers.ElapsedEventHandler(ClockTick);
    }
    public event EventHandler OnDonePlaying;
    public void PlayAll()
    {
        this.PlayNext();
    }
    private void PlayNext()
    {
        this.timer.Stop();
        var filename = this.queue.Dequeue();
        this.soundPlayer.SoundLocation = filename;
        this.soundPlayer.Play();
        this.timer.Interval = duration;
        this.timer.Start();
    }
    private void ClockTick(object sender, EventArgs e)
    {
        if (queue.Count == 0 ) {
            this.soundPlayer.Stop();
            this.timer.Stop();
            if (this.OnDonePlaying != null)
            {
                this.OnDonePlaying.Invoke(this, new EventArgs());
            }
        }
        else 
        {
            this.PlayNext();
        }
    }
}

try this:

ThreadPool.QueueUserWorkItem(o => {
                                    note.Play();
                                    Thread.Sleep(1000);
                                    note.Stop();
                                   });