WPF媒体播放器:如何按顺序播放,同步

本文关键字:播放 同步 顺序 何按 媒体播放器 WPF | 更新日期: 2023-09-27 17:58:18

我有这个函数:

public static void Play(string FileName, bool Async = false)
    {
        System.Windows.Media.MediaPlayer mp = new System.Windows.Media.MediaPlayer();
        mp.Open(FileName.ToUri());
        mp.Play();
    }

当我呼叫时

Play(@"file1.mp3");
Play(@"file2.mp3");
Play(@"file3.mp3");
Play(@"file4.mp3");

他们都在同一时间打球。

我如何让MediaPlayer等待文件结束,播放下一个?功能应该是什么样子?

编辑:

public static void Play(Uri FileName, bool Async = false)
    {
        AutoResetEvent a = new AutoResetEvent(false);
        MediaPlayer mp = new MediaPlayer();
        mp.MediaEnded += (o1, p1) =>
        {
            a.Set();
        };
        mp.MediaOpened += (o, p) =>
        {
            int total = Convert.ToInt32(mp.NaturalDuration.TimeSpan.TotalMilliseconds);
            mp.Play();
            if (!Async)
            {
                //System.Threading.Thread.Sleep(total);
                a.WaitOne();
            }
        };
        mp.Open(FileName);
    }

WPF媒体播放器:如何按顺序播放,同步

在下一个文件上调用Play之前,您需要等待当前文件完成播放。

这可以通过监听MediaEnded事件来实现。

您需要收听事件:

mp.MediaEnded += MediaEndedEventHandler;

但是,您还需要将MediaPlayer对象设置为静态对象,这样您就只能拥有其中一个对象。请确保只添加一次此处理程序。然后在处理程序中发出一个新事件以开始播放下一个文件。

您正在实现的是一个播放列表。因此,您需要将文件添加到播放列表中,然后需要跟踪您在播放列表中的当前位置。

我将与您分享我的解决方案:

我创建了一个窗口:WindowPlay.xaml

<Window x:Class="Sistema.Util.WindowPlay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WindowPlay" 
    AllowsTransparency="True"
    Background="Transparent"
    BorderBrush="Transparent"
    BorderThickness="0"
    ResizeMode="NoResize"
    WindowStyle="None"
    Top="0" Left="0"
    Width="16" Height="16" 
    ShowActivated="False"
    ShowInTaskbar="False"
>
    <Grid>
        <MediaElement Name="MediaElement1" LoadedBehavior="Play" UnloadedBehavior="Close"
                      MediaEnded="MediaElement1_MediaEnded" />
    </Grid>
</Window>

WindowPlay.xaml.cs:

using System;
using System.Windows;
namespace Sistema.Util
{
    /// <summary>
    /// Interaction logic for WindowPlay.xaml
    /// </summary>
    public partial class WindowPlay : Window
    {
        public WindowPlay()
        {
            try
            {
                InitializeComponent();
            }
            catch
            {
                this.Close();
            }
        }
        /// <summary>
        /// Plays the specified file name
        /// </summary>
        /// <param name="FileName">The filename to play</param>
        /// <param name="Async">If True play in background and return immediatelly the control to the calling code. If False, Play and wait until finish to return control to calling code.</param>
        public static void Play(Uri FileName, bool Async = false)
        {
            WindowPlay w = new WindowPlay();
            var mp = w.MediaElement1;
            if (mp == null)
            {
                // pode estar sendo fechada a janela
                return;
            }
            mp.Source = (FileName);
            if (Async)
                w.Show();
            else
                w.ShowDialog();
        }
        private void MediaElement1_MediaEnded(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}