beniao 发表于 2008-4-28 13:49

媒体播放器设计之旅(一)

媒体播放器设计之旅我计划是写一系列文章来介绍一个这个的系统的架构设计的.目前因为准备不够完善,就先简单介绍下一个播放器的开发过程,详细的架构设计是一个结合设计模式的一个综合架构体系.在后的时间里我会相续写出后续文章.有兴趣的朋友请关注.



下面我介绍下一个简单播放器的开发过程.

1.建议C#的WinFrom项目MP3.Player

  开发这个播放器是利用的MP的一个组件,所以在开发之间我门先引用两个.dll文件,我门先将这两个.dll加入到项目,他门分别是:

   [color=Magenta]AxInterop.WMPLib.dll  

   Interop.WMPLib.dll[/color]



2.将默认的窗体改名为mplayer.cs,并在里面放置好菜单控件menuStrip1,状态控件

  statusStrip1以及右键关联的快捷菜单等.(详细请下提供的源代码查看).



3.将Ax.Interop.WmpLib.dll库所提供的axWindowsMediaPlayer控件拽出一个到窗体上,以播放

  指定的文件,ListBox提供播放列表显示功能.



4.播放列表这样的小型数据在这里没有必要采用数据库来存储.我才用xml来存储.在项目

  bin\Debug下建立一个名为FileList.xml的xml文件,定义格式如下:

<?xml version="1.0" standalone="yes"?>
<FileList>
  <FileName>
    <Name>歌曲列表</Name>
  </FileName>

</FileList>



  同时在窗体里定义两个全局变量:

  string fileName = string.Empty;  //播放文件名
  int flag = 1;                    //播放文件索引



5.到这里我门可以着手代码的编写了.首先进入窗体加载事件里,在这里我门需要在程序启动就

  加载播放列表项到ListBox里显示,代码定义如下:

[color=Magenta]private void mplayer_Load(object sender, EventArgs e)
{
   timer1.Start();
   DataSet ds = new DataSet();
   ds.ReadXml("FileList.xml");
   for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
   {
       object[] list = new object[i];
       list = ds.Tables[0].Rows[i].ItemArray;
       listBox1.Items.Add(list[0].ToString().Substring(list[0].ToString().LastIndexOf('\\') + 1));
       fileName = list[0].ToString().Substring(0, list[0].ToString().LastIndexOf('\\') + 1);
    }
}[/color]



6.先实现菜单里的打开文件目录的功能:

  [color=Magenta]if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
  {
      //取得用户选择的路径
      fileName = folderBrowserDialog1.SelectedPath;
      string[] mp3Name = Directory.GetFiles(fileName);
      foreach (string var in mp3Name)
      {
         listBox1.Items.Add(flag + "." + var.Substring(var.LastIndexOf('\\') + 1));
         flag++;   //列表索引号
      }
   }[/color]



7.播放列表里是没有数据的,下面我门来为其指定播放目录,并把目录下的文件加在到ListBox

   控件,同时实现保存播放列表项到xml文件里.

   在这里我门先指定ListBox的ContextMenuStrip属性为先前准备好的contextMenuStrip1,他

   的设计如下:
[img]http://fm411.img.xiaonei.com/blog/20080402/23/01/A846361568256GAR.jpg[/img]
            

  实现Add File(添加单个播放文件的操作):

  [color=Magenta]if (openFileDialog1.ShowDialog() == DialogResult.OK)
  {
      string strName = openFileDialog1.FileName;
      fileName = strName.Substring(0, strName.LastIndexOf('\\') + 1);
      listBox1.Items.Add(flag + "." + strName.Substring(strName.LastIndexOf('\\') + 1));
      flag++;
   }[/color]

   实现Add Files(添加播放目录的操作):

   这里同菜单里打开目录的功能一样,所以我门可以直接调用菜单里打开目录的事件来完成:

   openToolStripMenuItem_Click(null, null);到这里我门先来看看效果:
[img]http://fm401.img.xiaonei.com/blog/20080402/23/09/A896543830924THO.jpg[/img]

   删除文件也就是删除ListBox的列表项目,直接调用ReMove方法搞定,这里就不多说.下面来看

   看保存功能的实现.

   [color=Magenta]int list = this.listBox1.Items.Count;
   for (int i = 0; i < list; i++)
   {
       if (listBox1.Items[i].ToString().Equals("") || listBox1.Items[i].Equals("歌曲列表"))
        {
             continue;
        }
        DataSet ds = new DataSet();
        ds.ReadXml(Application.StartupPath + "\\FileList.xml");
        DataRow dr = ds.Tables[0].NewRow();
        dr["Name"] = fileName + "\\" + listBox1.Items[i].ToString();
        ds.Tables[0].Rows.Add(dr);
        ds.WriteXml(Application.StartupPath + "\\FileList.xml");
   }
   MessageBox.Show("当前列表保存成功\n下次你可以轻松享受音乐给你带来的快乐!\n程序设计:Beniao  Http://beniao.cnblogs.com", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);[/color]


8.由于是一个简单的播放器程序,内部程序并不是很复杂,我都只是简单的介绍下基本的实现过

  程.下面我门看看怎么实现在ListBox里双击实现播放指定的文件的功能,也许这个才是大家

  所关注的:

  [color=Magenta]timer1.Start();
  try
  {
     string palyName = fileName + "\\" + listBox1.SelectedItem.ToString().Substring(listBox1.SelectedItem.ToString().IndexOf('.') + 1);
     this.axWindowsMediaPlayer1.URL = palyName;
  }
  catch (Exception ex)
  {
     MessageBox.Show("对不起,不能找到你指定的文件,请确认你的文件路径!" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }[/color]


到这里,简单播放器的开发就这样简单介绍完了,我门来看看运行的效果.:

[img]http://fm381.img.xiaonei.com/blog/20080402/23/16/A936942743010HEI.jpg[/img]

当然这个只是一个简单的播放器,我写文章所介绍的也就是他的一些简单的基本功能,要把这个程序开发完善还需要发一定的功夫,见于时间关系,我也只能做到这里,如果那位朋友有兴趣可以帮忙完善下这个程序,需要源代码的朋友请在下面留言.

shezhenhui1989 发表于 2008-4-29 09:17

顶了,..........

hebingbing 发表于 2008-4-29 11:22

帮顶……
呵呵……

losin 发表于 2008-5-10 10:36

看到好东西,不顶可以吗?
答:不可不顶!
help_bod@qq.com可以发到我的邮箱,共同就感兴趣话题,做下研究!

[[it] 本帖最后由 losin 于 2008-5-10 10:38 编辑 [/it]]

snipen 发表于 2008-5-10 10:59

应该放在C#论坛,这是asp.net,恐怕网页上不能实现,但学是项下

beniao 发表于 2008-5-11 02:04

回复 3# 的帖子

已经发送到你箱子里.

stealdream 发表于 2008-5-11 18:07

LZ。可不可以发到我邮箱给我看看呀,
zhouwei9960@163.com

beniao 发表于 2008-5-11 21:31

回复 6# 的帖子

你可以直接到我博客去下载..
http://beniao.cnblogs.com在C#分栏里.

dogdays 发表于 2008-6-11 11:24

谢谢分享啦!顶,顶......

beniao 发表于 2008-6-21 19:20

回复 9# dogdays 的帖子

呵呵  N久没来这里了。。。人气还是这么旺

gupiao175 发表于 2008-6-23 10:19

原来是应用程序的,哎!

原来是应用程序的,哎!俺不董啊,建议真的应该放到C#里去。而不是这里![em07]

beniao 发表于 2008-6-28 00:16

回复 11# gupiao175 的帖子

不管是应用还是Web都同属于.NET Framework里的东东,为什么又非要分得那么详细呢?技术的本质是什么?我想不是去分类吧。

jxlzw 发表于 2008-6-28 07:15

Interop.WMPLib.dll 该从何处下载?

Interop.WMPLib.dll 该从何处下载?我有网上找了下,没找着,可否提供一下?谢了。

beniao 发表于 2008-6-29 15:43

回复 13# jxlzw 的帖子

这个东西在你自己的电脑里就有的,Windows Media Player的一个库。如果找不到就发邮件给我吧,我传给你。beniao123@163.com

吴胜 发表于 2008-8-17 18:45

我是新鸟!

希望可以发到我的272661526@qq.com上学习哈!非常谢谢了!
积累能让我笨鸟先飞是不?呵呵!再次非常感谢了!

吴胜 发表于 2008-8-17 19:02

去看了没找到啊?

我刚区看了没有找到啊?要不麻烦你发我邮箱上吧272661526@qq.com?真的很感兴趣非常感谢了!

页: [1]

编程论坛