黑马程序员技术交流社区
标题:
WindowsMediaPlayer1自动播放问题
[打印本页]
作者:
一扇车门
时间:
2013-5-2 11:40
标题:
WindowsMediaPlayer1自动播放问题
本帖最后由 一扇车门 于 2013-5-8 09:23 编辑
不知道那里出了问题,WindowsMediaPlayer1播放完后,不能自动播放下一首,老是要手动点击播放才播放 ,怎样才能让它自动播放下一首呢?
private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
if (PlayList.SelectedIndex < this.PlayList.Items.Count - 1)
{
axWindowsMediaPlayer1.URL = this.PlayList.Items[PlayList.SelectedIndex + 1].ToString();
//axWindowsMediaPlayer1.URL = (PlayList.SelectedValue + 1).ToString();
this.Text = "我的播放器" + PlayList.Items[PlayList.SelectedIndex + 1].ToString();
this.PlayList.SelectedIndex += 1;
//this.axWindowsMediaPlayer1.Controls.play();
}
else
{
axWindowsMediaPlayer1.URL = this.PlayList.Items[PlayList.SelectedIndex].ToString();
}
}
}
作者:
张伟86
时间:
2013-5-3 21:38
本帖最后由 张伟86 于 2013-5-3 21:41 编辑
歌曲播放.zip
(113.06 KB, 下载次数: 15)
2013-5-3 21:41 上传
点击文件名下载附件
实验了很长时间啊,终于得到点实质性进展。
1、 我依照楼主给出的函数,调试发现在wmppsMediaEnded后,函数还会被调用,除了play,pause,stopped之外,最邪恶的要数wmppsTransitioning了。我调试的时候发现是在2次wmppsTransitioning之后播放中的文件被暂停了,不知道什么原因。总之,依照给出的函数思路,我没有获得实质性进展。
2、既然思路有问题,就换个思路。最后总结出来:使用axWindowsMediaPlayer1 的自动循环来播放下一首歌,在PlayList中选择了要播放的歌后,使用axWindowsMediaPlayer1 的CtlControl的next和previous来调节axWindowsMediaPlayer1 当前要播放的歌曲,以达到歌曲对应目录的目的。
1)button控件打开文件目录,获得目录path,使用FileInfo数组结构,将目录下的文件全部保存入FileInfo数组结构的files对象中,便于对文件进行操作(比如,取名字,取完整路径。)。将文件目录下的文件送入PlayList列表显示(代码比较粗糙,未判断目录下文件,实验文件为文件夹下都是mp3文件,主要讲思路);同时将文件依次填充如axWindowsMediaPlayer1的currentPlayList的Item中,这样FileInfo文件次序、PlayList文件次序、axWindowsMediaPlayer1中currentPlayList中的Item次序一一对应。方便以后操作。填充axWindowsMediaPlayer1的currentPlayList主要是为了自动循环播放的列表次序问题。这样设置后使用语句this.axWindowsMediaPlayer1.settings.setMode("loop", true);,当歌曲被播放时,会发现,再一首歌播放完毕后可以进行第二首歌的自动播放,并且播放到最后文件后可以转到第一首歌。也就实现了楼主的自动播放功能。
2)不过如此的时候,歌曲在往下播放,但是PlayList的SelectedIndex却未被改变,而它应该是需要对应歌曲而改变的,那么就重载axWindowsMediaPlayer1 的axWindowsMediaPlayer1_CurrentItemChange事件,手动调节PlayList当前选择项。以达到一一对应目的。
3)前面结束后,需要设置点击PlayList播放对应文件的操作。重载PlayList的PlayList_SelectedIndexChanged事件,这个主要是在程序实现过程中,我发现axWindowsMediaPlayer1无法获得当前播放项的Item顺序,那就需要手动调节。借助于PlayList_SelectedIndexChanged事件和2个int变量indexOld(保存changed以前的次序)、indexNew(保存现在的次序),我们会知道要如何调节axWindowsMediaPlayer1的currentMedia属性。
4)接下来就是重载PlayList的PlayList_DoubleClick事件了。再其中,我们需要判断我们重新选择的歌曲是位于先前播放歌曲的上面,下面,还是未动,以达到对应播放关系。在PlayList中选择了要播放的歌后,使用 axWindowsMediaPlayer1 的CtlControl的next和previous来调节 axWindowsMediaPlayer1 当前要播放的歌曲,以达到歌曲对应目录的目的。
主要代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
FileInfo[] files; //存储打开目录下文件信息
int indexOld = 0; //存储先前的PlayList的SelectedIndex信息;能这样做的原因是因为在PlayList.Items.Add(file.Name);这个语句执行的时候SelectedIndex被调用了一次,也就保存了indexOld的初始化值。
int indexNew = 0; //存储变化后的PlayList的SelectedIndex信息。
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 读取目录下文件,填充PlayList和axWindowsMediaPlayer1.currentPlaylist的Item,并且设置axWindowsMediaPlayer1的循环属性;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)//打开目录选项
{
DirectoryInfo di = new DirectoryInfo(folderBrowserDialog1.SelectedPath);//使用DirectoryInfo结构辅助获取目录下文件信息
files = di.GetFiles();//保存目录下文件信息;
foreach (FileInfo file in files) //循环读取文件信息,填充PlayList和axWindowsMediaPlayer1.currentPlaylist的Item
{
PlayList.Items.Add(file.Name);
axWindowsMediaPlayer1.currentPlaylist.appendItem(axWindowsMediaPlayer1.newMedia(file.FullName));
}
this.axWindowsMediaPlayer1.settings.setMode("loop", true); //设置axWindowsMediaPlayer1的循环属性;
}
}
/// <summary>
/// 当axWindowsMediaPlayer1播放下一首歌时,使PlayList.SelectedIndex到达对应处。为什么要使用循环判断?因为axWindowsMediaPlayer1的当前是第几首歌不知道,我们就采用axWindowsMediaPlayer1当前播放歌的文件名与PlayList中的文件名对应判断来获得当前PlayList.SelectedIndex。为什么要Contains?当然,如果你的PlayList中保存的是全路径,那就==就可以了,如果只是文件名,那还是用Contains吧。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axWindowsMediaPlayer1_CurrentItemChange(object sender, AxWMPLib._WMPOCXEvents_CurrentItemChangeEvent e)
{
for (int i = 0; i< PlayList.Items.Count;i++)
{
if (axWindowsMediaPlayer1.currentMedia.sourceURL.Contains(PlayList.Items[i].ToString()))
{
PlayList.SelectedIndex = i;
}
}
}
/// <summary>
/// PlayList选择歌曲后,调节当前播放歌曲到相应歌曲位置并播放。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PlayList_DoubleClick(object sender, EventArgs e)
{
//axWindowsMediaPlayer1.currentMedia.setItemInfo("sourceURL",files[PlayList.SelectedIndex].FullName);
if (indexOld < indexNew)//当前PlayList.SelectedIndex位于上首歌播放之后,使用next到达指定歌曲处
{
for (int i = 0; i < indexNew - indexOld;i++ )
{
axWindowsMediaPlayer1.Ctlcontrols.next();
}
}
else if (indexOld > indexNew)//当前PlayList.SelectedIndex位于上首歌播放之前,使用previous到达指定歌曲处
{
for (int i = 0; i < indexOld - indexNew; i++)
{
axWindowsMediaPlayer1.Ctlcontrols.previous();
}
}
else if (indexNew == indexOld)//没变位置,直接播放。
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
//axWindowsMediaPlayer1.Ctlcontrols.play();
}
/// <summary>
/// 获取歌曲位置信息
/// int indexOld = 0; //存储先前的PlayList的SelectedIndex信息;能这样做的原因是因为在PlayList.Items.Add(file.Name);这个语句执行的时候SelectedIndex被调用了一次,也就保存了indexOld的初始化值。
int indexNew = 0; //存储变化后的PlayList的SelectedIndex信息。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PlayList_SelectedIndexChanged(object sender, EventArgs e)
{
indexOld = indexNew;
indexNew = PlayList.SelectedIndex;
//MessageBox.Show(indexOld.ToString());
}
}
}
复制代码
附上源代码:(很简陋的,只是个思路)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2