使用 MediaPlayer 控件自动播放下一个文件(AxWindowsMediaPlayer)
Play next file automatically using MediaPlayer Control(AxWindowsMediaPlayer)
在 PlayStateChange 事件中更改 AxWindowsMediaPlayer URL 时,它不会自动开始播放,只是变为“就绪”状态。
我的 C# WinForms 程序中有一个“AxWindowsMediaPlayer”控件。当我通常更改 WindowsMediaPlayer1 的 URL
属性 时,它工作正常并自动播放新的 mp3 文件。
当歌曲结束时 WindowsMediaPlayer1 状态变为 Stopped
并且我希望下一首 URL
自动开始播放。
我使用了PlayStatChange
事件,所以当播放器状态为Stopped
时,URL
会改变,但不会自动播放!
播放器进入 Ready
状态,直到我按下 WindowsMediaPlayer1 上的播放按钮。
代码如下:
private void Form1_Load(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "6.mp3"; //Works fine
}
private void button1_Click(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "4.mp3"; //Works fine. It changes the music.
}
private void WindowsMediaPlayer1_PlayStateChange(object sender,
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1) //1 is for "Stopped" State
WindowsMediaPlayer1.URL = "5.mp3";
// Here is the problem.
// URL Will change but player goes to "Ready" State
// But not in "playing" until I press the play button in control.
}
如有任何帮助,我们将不胜感激。
我在 msdn 上找到了这篇关于 player.URL 的注释:
"Do not call this method from event handler code. Calling URL from an event handler may yield unexpected results."
所以我尝试了另一种方法来解决它并且成功了。
添加了一个计时器和一个布尔变量来检查 WindowsMediaPlayer1 是否 "Stopped"
解决方法如下:
public partial class Form1 : Form
{
bool nextURL = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "5.mp3";
}
private void WindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1) // 1 is consider for "Stopped" State
{
nextURL = true; // if the song ended "nextURL" flag sets to true
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (nextURL)
{
WindowsMediaPlayer1.URL = "6.mp3";
nextURL = false;
}
}
如媒体播放器 documentations 中所述,您不应在事件处理程序代码中设置 Url
。相反,您可以这样播放下一个文件:
private void axWindowsMediaPlayer1_PlayStateChange(object sender,
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1)
{
this.BeginInvoke(new Action(() => {
this.axWindowsMediaPlayer1.URL = @"address of nextfile";
}));
}
}
此外,您可以考虑使用 playlist.
作为另一种选择
在 PlayStateChange 事件中更改 AxWindowsMediaPlayer URL 时,它不会自动开始播放,只是变为“就绪”状态。
我的 C# WinForms 程序中有一个“AxWindowsMediaPlayer”控件。当我通常更改 WindowsMediaPlayer1 的 URL
属性 时,它工作正常并自动播放新的 mp3 文件。
当歌曲结束时 WindowsMediaPlayer1 状态变为 Stopped
并且我希望下一首 URL
自动开始播放。
我使用了PlayStatChange
事件,所以当播放器状态为Stopped
时,URL
会改变,但不会自动播放!
播放器进入 Ready
状态,直到我按下 WindowsMediaPlayer1 上的播放按钮。
代码如下:
private void Form1_Load(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "6.mp3"; //Works fine
}
private void button1_Click(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "4.mp3"; //Works fine. It changes the music.
}
private void WindowsMediaPlayer1_PlayStateChange(object sender,
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1) //1 is for "Stopped" State
WindowsMediaPlayer1.URL = "5.mp3";
// Here is the problem.
// URL Will change but player goes to "Ready" State
// But not in "playing" until I press the play button in control.
}
如有任何帮助,我们将不胜感激。
我在 msdn 上找到了这篇关于 player.URL 的注释:
"Do not call this method from event handler code. Calling URL from an event handler may yield unexpected results."
所以我尝试了另一种方法来解决它并且成功了。
添加了一个计时器和一个布尔变量来检查 WindowsMediaPlayer1 是否 "Stopped"
解决方法如下:
public partial class Form1 : Form
{
bool nextURL = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
WindowsMediaPlayer1.URL = "5.mp3";
}
private void WindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1) // 1 is consider for "Stopped" State
{
nextURL = true; // if the song ended "nextURL" flag sets to true
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (nextURL)
{
WindowsMediaPlayer1.URL = "6.mp3";
nextURL = false;
}
}
如媒体播放器 documentations 中所述,您不应在事件处理程序代码中设置 Url
。相反,您可以这样播放下一个文件:
private void axWindowsMediaPlayer1_PlayStateChange(object sender,
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (e.newState == 1)
{
this.BeginInvoke(new Action(() => {
this.axWindowsMediaPlayer1.URL = @"address of nextfile";
}));
}
}
此外,您可以考虑使用 playlist.
作为另一种选择