我有这个功能:
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);
}
答案 0 :(得分:3)
在下一次调用Play
之前,您需要等待当前文件完成播放。
这是通过收听MediaEnded事件来完成的。
你需要听取这个事件:
mp.MediaEnded += MediaEndedEventHandler;
但是,您需要将MediaPlayer
对象设置为静态,这样您才能拥有其中一个。确保只添加此处理程序一次。然后在处理程序中发出一个新事件以开始播放下一个文件。
您正在实施的是播放列表。因此,您需要将文件添加到播放列表中,然后您需要跟踪播放列表中的当前位置。
答案 1 :(得分:1)
我将与您分享我的解决方案:
我创建了一个Window: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();
}
}
}