A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一扇车门 中级黑马   /  2013-5-2 11:40  /  2355 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一扇车门 于 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();

                }
           
            }
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 张伟86 于 2013-5-3 21:41 编辑

歌曲播放.zip (113.06 KB, 下载次数: 15)

实验了很长时间啊,终于得到点实质性进展。
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 当前要播放的歌曲,以达到歌曲对应目录的目的。
主要代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;


  10. namespace WindowsFormsApplication2
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         FileInfo[] files; //存储打开目录下文件信息
  15.         int indexOld = 0; //存储先前的PlayList的SelectedIndex信息;能这样做的原因是因为在PlayList.Items.Add(file.Name);这个语句执行的时候SelectedIndex被调用了一次,也就保存了indexOld的初始化值。
  16.         int indexNew = 0; //存储变化后的PlayList的SelectedIndex信息。
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }

  21.         /// <summary>
  22.         /// 读取目录下文件,填充PlayList和axWindowsMediaPlayer1.currentPlaylist的Item,并且设置axWindowsMediaPlayer1的循环属性;
  23.         /// </summary>
  24.         /// <param name="sender"></param>
  25.         /// <param name="e"></param>
  26.         private void button1_Click(object sender, EventArgs e)
  27.         {
  28.             if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)//打开目录选项
  29.             {
  30.                 DirectoryInfo di = new DirectoryInfo(folderBrowserDialog1.SelectedPath);//使用DirectoryInfo结构辅助获取目录下文件信息
  31.                 files = di.GetFiles();//保存目录下文件信息;
  32.                 foreach (FileInfo file in files) //循环读取文件信息,填充PlayList和axWindowsMediaPlayer1.currentPlaylist的Item
  33.                 {
  34.                     PlayList.Items.Add(file.Name);
  35.                     axWindowsMediaPlayer1.currentPlaylist.appendItem(axWindowsMediaPlayer1.newMedia(file.FullName));
  36.                 }
  37.                 this.axWindowsMediaPlayer1.settings.setMode("loop", true); //设置axWindowsMediaPlayer1的循环属性;               
  38.             }
  39.         }
  40.         /// <summary>
  41.         /// 当axWindowsMediaPlayer1播放下一首歌时,使PlayList.SelectedIndex到达对应处。为什么要使用循环判断?因为axWindowsMediaPlayer1的当前是第几首歌不知道,我们就采用axWindowsMediaPlayer1当前播放歌的文件名与PlayList中的文件名对应判断来获得当前PlayList.SelectedIndex。为什么要Contains?当然,如果你的PlayList中保存的是全路径,那就==就可以了,如果只是文件名,那还是用Contains吧。
  42.         /// </summary>
  43.         /// <param name="sender"></param>
  44.         /// <param name="e"></param>
  45.         private void axWindowsMediaPlayer1_CurrentItemChange(object sender, AxWMPLib._WMPOCXEvents_CurrentItemChangeEvent e)
  46.         {
  47.             for (int i = 0; i< PlayList.Items.Count;i++)
  48.             {
  49.                 if (axWindowsMediaPlayer1.currentMedia.sourceURL.Contains(PlayList.Items[i].ToString()))
  50.                 {
  51.                     PlayList.SelectedIndex = i;
  52.                 }
  53.             }
  54.             
  55.         }
  56.         /// <summary>
  57.         /// PlayList选择歌曲后,调节当前播放歌曲到相应歌曲位置并播放。
  58.         /// </summary>
  59.         /// <param name="sender"></param>
  60.         /// <param name="e"></param>
  61.         private void PlayList_DoubleClick(object sender, EventArgs e)
  62.         {
  63.             //axWindowsMediaPlayer1.currentMedia.setItemInfo("sourceURL",files[PlayList.SelectedIndex].FullName);
  64.             if (indexOld < indexNew)//当前PlayList.SelectedIndex位于上首歌播放之后,使用next到达指定歌曲处
  65.             {
  66.                 for (int i = 0; i < indexNew - indexOld;i++ )
  67.                 {
  68.                     axWindowsMediaPlayer1.Ctlcontrols.next();
  69.                 }
  70.             }
  71.             else if (indexOld > indexNew)//当前PlayList.SelectedIndex位于上首歌播放之前,使用previous到达指定歌曲处
  72.             {
  73.                 for (int i = 0; i < indexOld - indexNew; i++)
  74.                 {
  75.                     axWindowsMediaPlayer1.Ctlcontrols.previous();
  76.                 }
  77.             }
  78.             else if (indexNew == indexOld)//没变位置,直接播放。
  79.             {
  80.                 axWindowsMediaPlayer1.Ctlcontrols.play();
  81.             }
  82.             //axWindowsMediaPlayer1.Ctlcontrols.play();
  83.         }
  84.         /// <summary>
  85.         /// 获取歌曲位置信息
  86.         /// int indexOld = 0; //存储先前的PlayList的SelectedIndex信息;能这样做的原因是因为在PlayList.Items.Add(file.Name);这个语句执行的时候SelectedIndex被调用了一次,也就保存了indexOld的初始化值。
  87.         int indexNew = 0; //存储变化后的PlayList的SelectedIndex信息。
  88.         /// </summary>
  89.         /// <param name="sender"></param>
  90.         /// <param name="e"></param>
  91.         private void PlayList_SelectedIndexChanged(object sender, EventArgs e)
  92.         {
  93.             indexOld = indexNew;            
  94.             indexNew = PlayList.SelectedIndex;
  95.             //MessageBox.Show(indexOld.ToString());
  96.         }
  97.     }
  98. }
复制代码
附上源代码:(很简陋的,只是个思路)




评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马