C#中利用mediaplayer打造mp3播放器

利用WindowMediaPlayer控件自己做一款小巧的mp3播放器来听音乐,是不是很享受呢?今天刚写出来的,听听mp3感觉还不错哦。闲话少说,进入正题。

  Mp3播放器主要完成下列功能:

  1.添加歌曲,可以添加单个乐曲或者指定文件夹内包括其子文件夹内的所有mp3乐曲到播放列表。
 
  2.删除指定歌曲或所有歌曲。

  3.播放的控制。包括选择上一首,下一首播放,顺序播放,循环播放和随机播放。循环播放又分单个歌曲的循环播放和所有歌曲的循环播放。

  首先建立类player。

publicclassPlayer
{
 privateWMPLib.WindowsMediaPlayermyPlayer;
 privatestring[]playList;
 privateintnumOfMusic;
 privateintcurrentPlay;

 publicintNumOfMusic
 {
  get
  {
   returnnumOfMusic;
  }
 }

 publicWMPLib.WMPPlayStateplaystate
 {
  get
  {
   returnmyPlayer.playState;
  }
 }

 publicstringPlayList(intnum)
 {
  returnplayList[num];
 }

 publicPlayer(AxWMPLib.AxWindowsMediaPlayermediaPlayer)
 {
  myPlayer=mediaPlayer;
  playList=newstring[1000];
  numOfMusic=0;
 }

 publicvoidAddFile(stringpath)
 {
  if(numOfMusic<1000)
  {
   numOfMusic++;
   playList[numOfMusic]=path;
  }
 }

 publicvoidDelFile(intselectNum)
 {
  for(inti=selectNum;i<=numOfMusic-1;i++)
  {
   playList[i]=playList[i+1];
  }
  numOfMusic--;
 }

 publicvoidplay(intselectNum)
 {
  myPlayer.URL=playList[selectNum];
  currentPlay=selectNum;
 }

 publicintNextPlay(inttype)
 {
  /*type=0顺序

  type=1重复播放全部
  type=2重复播放一首
  type=3随机播放

  */

  switch(type)
  {
   case0:
    currentPlay++;
    if(currentPlay>numOfMusic)return0;
    elsereturncurrentPlay;
   case1:
    currentPlay++;
    if(currentPlay>numOfMusic)return1;
    elsereturncurrentPlay;
   case2:
    returncurrentPlay;
   case3:
    Randomrdm=newRandom(unchecked((int)DateTime.Now.Ticks));
    currentPlay=rdm.Next()%numOfMusic;
    if(currentPlay==0)returnnumOfMusic;
    elsereturncurrentPlay;
   default:
    return0;
  }
 }
}
  Player类中包括一个windowsMediaPlayer对象myPlayer,一个存储播放列表的数组playlist,记录歌曲总数的numOfMusic,以及当前播放的歌曲对应列表中的序号currentplay;另外有四个方法分别是Play,AddFile,DelFile,以及获得下次播放序号的NextPlay

  分功能列出其他主要代码

  添加单个歌曲

if(this.openFileDialog1.ShowDialog()==DialogResult.OK)
{
 stringpath=this.openFileDialog1.FileName;
 FileInfof=newFileInfo(path);
 MyPlayer.AddFile(f.FullName);
 stringSTRFILE=Convert.ToString(MyPlayer.NumOfMusic);
 for(inti=1;i<=5-STRFILE.Length;i++)STRFILE+=’’;
 STRFILE+=f.Name;
 this.listBox1.Items.Add(STRFILE);
}
  添加一个文件夹及其所有子文件夹的歌曲

  利用递归函数showfiles实现所有层歌曲都添加到歌曲列表中。

privatevoidshowfiles(stringpath,ListBoxlistBox1)
{
 DirectoryInfodir=newDirectoryInfo(path);
 foreach(FileInfofindir.GetFiles("*.mp3"))
 {
  MyPlayer.AddFile(f.FullName);
 }
 foreach(DirectoryInfofindir.GetDirectories())
 {
  showfiles(f.FullName,listBox1);
 }
  删除和清空直接调用类Player中的AddFile和DelFile函数

  实现播放上一首

if(listBox1.SelectedIndex>=0)
{
 listBox1.SelectedIndex--;
 if(listBox1.SelectedIndex<0)listBox1.SelectedIndex=MyPlayer.NumOfMusic-1;
 MyPlayer.play(listBox1.SelectedIndex+1);
}
  下一首

if(listBox1.SelectedIndex>=0)
{
 listBox1.SelectedIndex=(listBox1.SelectedIndex+1)%MyPlayer.NumOfMusic;
 MyPlayer.play(listBox1.SelectedIndex+1);
}
  播放的控制

  利用Player的NextPlay方法返回的值来选择下一次播放的内容。

  同时利用PlayStateChange事件来实现由一曲到下一曲的替换,但是在响应PlayStateChange事件的时候直接改变Player的url无法让它直接播放下一曲,解决方法如下:

privatevoidaxWindowsMediaPlayer1_PlayStateChange(objectsender,AxWMPLib._WMPOCXEvents_PlayStateChangeEvente)
{
 if(MyPlayer.playstate==WMPLib.WMPPlayState.wmppsMediaEnded)
 {
  timer1.Start();
 }
}

privatevoidtimer1_Tick(objectsender,System.EventArgse)
{
 timer1.Stop();
 intselectnum=0;
 if(menuItem13.Checked)selectnum=MyPlayer.NextPlay(0);
 elseif(menuItem15.Checked)selectnum=MyPlayer.NextPlay(1);
 elseif(menuItem16.Checked)selectnum=MyPlayer.NextPlay(2);
 elseif(menuItem17.Checked)selectnum=MyPlayer.NextPlay(3);
 if(selectnum!=0)
 {
  listBox1.SelectedIndex=selectnum-1; 
  MyPlayer.play(selectnum);
 }
}
  满足一首歌曲结束的条件的时候唤醒计时器,计时器100ms内就响应函数timer1_Tick,在这个函数里实现下一首歌曲的选择播放便可以顺利进行.

你可能感兴趣的:(C++,c,C#,F#,音乐)