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);
}
在下一个文件上调用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();
}
}
}