基于WindowsMediaPlayer组件的简单播放器的设计
来源:互联网 发布:mac os x最新版本是 编辑:程序博客网 时间:2024/05/16 00:33
首先,在VS中创建一个Winform项目,然后在工具箱中组件中右键选择“选择项”,添加COM组件中的WindowMediaPlayer的组件
设置该WindowMediaPlayer对象的Name为musicPlayer
添加一个点击后可以播放或者暂停的按钮设计其Name属性btnPlayOrPause,Text属性为“播放”
添加一个停止播放按钮设计其Name属性为btnStop,Text属性为"停止"
添加一个打开文件按钮设计其Name属性为btnOpenFile,Text属性为"打开音乐文件"
添加一个存放音乐文件名的列表框设计其Name属性为lboSongs ,设置其SelectionMode属性为MultiExtended(为了多项删除歌曲),ContextMenuStrip:ContextMenuStripOfLboSongs(绑定操作,之前需要添加一个ContextMenuStrip控件,Name:ContextMenuStripOfLboSongs)
添加下一首按钮btnNextSong,Text:下一首
添加上一首按钮btnLastSong,Text:上一首
加大音量按钮btnAddVoice,Text:+
加大音量按钮btnAddVoice,Text:-
添加一个用来显示歌词的标签控件,Name:lbLrc
一、窗体加载时
<span style="font-size:24px;"> private void Form1_Load(object sender, EventArgs e) { //取消播放器的自动播放功能 musicPlayer.settings.autoStart = false; //设置播放和暂停按钮不可用 btnPlayOrPause.Enabled = false; }</span>
二、播放/暂停的实现
<pre name="code" class="csharp"> bool b = true; private void btnPlayOrPause_Click(object sender, EventArgs e) { if (btnPlayOrPause.Text == "播放") { if (b) { //实现单击从头播放选中的歌曲 musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex]; } musicPlayer.Ctlcontrols.play(); btnPlayOrPause.Text = "暂停"; } else if (btnPlayOrPause.Text == "暂停") { musicPlayer.Ctlcontrols.pause(); btnPlayOrPause.Text = "播放"; b=false; } }
三、停止播放的实现
private void btnStop_Click(object sender, EventArgs e) { //停止播放 musicPlayer.Ctlcontrols.stop(); //播放或者停止按钮的文本显示为播放 btnPlayOrPause.Text = "播放"; }
四 打开音乐文件添加到歌单的实现
//用来存储歌曲全路径的集合 List<string> listSongsPaths = new List<string>(); private void btnOpenFile_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); //对话框的标题 ofd.Title = "请您选择要打开的文件"; //是否多选 ofd.Multiselect = true; //过滤文件类型 ofd.Filter = "所有文件|*.*|MP3文件|*.mp3"; //初始化打开路径 ofd.InitialDirectory = @"F:\音乐"; //显示打开对话框 ofd.ShowDialog(); //获取打开对话框中用户所选的全部文件的的全路径 string[] paths = ofd.FileNames; for (int i = 0; i <paths.Length; i++) { //如果选取的文件的全路径在集合中不存在,将歌曲名存在到歌曲列表框中 if(!listSongsPaths.Contains(paths[i])) { listSongsPaths.Add(paths[i]); //仅存文件名 lboSongs.Items.Add(Path.GetFileNameWithoutExtension(paths[i])); } } }<span style="font-size:24px;"> </span>五、双击播放的实现
private void lboSongs_DoubleClick(object sender, EventArgs e) { if (lboSongs.Items.Count == 0) { MessageBox.Show("请您先选择要播放的文件"); return; } //选中歌曲的路径给播放器的URL //try-catch目的在于消除双击空白处的异常 try { musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex]; musicPlayer.Ctlcontrols.play(); //获取歌词 GetLrc(listSongsPaths[lboSongs.SelectedIndex]); btnPlayOrPause.Text = "暂停"; } catch { } }
六、下一首播放的实现
private void btnNextSong_Click(object sender, EventArgs e) { //获取lboSongs的当前索引 int index = lboSongs.SelectedIndex; //清空所有选中的索引项 lboSongs.SelectedIndices.Clear(); index++; //如果是最后一首的则索引设置到第一首 if (index == lboSongs.Items.Count) { index=0; } //将当前索引指向下一曲 lboSongs.SelectedIndex = index; //播放下一首 musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex]; musicPlayer.Ctlcontrols.play(); }七、上一首播放的实现
private void btnLastSong_Click(object sender, EventArgs e) { //获取lboSongs的当前索引 int index = lboSongs.SelectedIndex; //清空所有选中的索引项,避免多选 lboSongs.SelectedIndices.Clear(); index--; if (index == -1) { index = lboSongs.Items.Count-1; } //将当前索引指向下一曲 lboSongs.SelectedIndex = index; musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex]; musicPlayer.Ctlcontrols.play(); }八、多选删除歌曲的实现
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { //获取删除选中项的个数 int rmCount = lboSongs.SelectedItems.Count; //必须先删除集合在删除列表,否则可能超出索引界限 for (int i = 0; i < rmCount; i++) { //先删集合 listSongsPaths.RemoveAt(lboSongs.SelectedIndex); //再删列表 lboSongs.Items.RemoveAt(lboSongs.SelectedIndex); } }九、自动下一曲功能的实现
添加一个Time控件,Name:timerAutoNextSong,interval=1000(单位为ms,设置为1000表示每1s执行一次),tick事件的处理
private void timerAutoNextSong_Tick(object sender, EventArgs e) { //音乐处于播放状态 if (musicPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying) { //歌曲的总时间 double d1 = musicPlayer.currentMedia.duration; //当期播放到的时间 double d2 = musicPlayer.Ctlcontrols.currentPosition; if (d1 <= d2 + 1) { //获取lboSongs的当前索引 int index = lboSongs.SelectedIndex; //清空所有选中的索引项 lboSongs.SelectedIndices.Clear(); index++; if (index == lboSongs.Items.Count) { index = 0; } //将当前索引指向下一曲 lboSongs.SelectedIndex = index; musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex]; musicPlayer.Ctlcontrols.play(); } } }十、歌词的实现
创建检测歌词的Timer控件,Name:TimerLrc,interval=1000
List<double> lrcTime = new List<double>();//存储歌词的时刻集合 List<string> lrcText = new List<string>();//存储歌词对应时刻的内容 public void GetLrc(string FilePath) { //获取歌词的去路径 FilePath = FilePath.Substring(0, FilePath.IndexOf('.') + 1) + "lrc"; //歌词文件是否存在,不存在显示无法找到歌词 if (File.Exists(FilePath)) { lrcTime.Clear(); lrcText.Clear(); //读取歌词文件中的每一行,结果放在allLinesLrc数组 string[] allLinesLrc = File.ReadAllLines(FilePath,Encoding.UTF8); //去掉前两行的歌词,结果放在newAllLineLec数组 string[] newAllLineLrc=new string[allLinesLrc.Length-2]; int k=0; for (int i = 2; i < allLinesLrc.Length; i++) { newAllLineLrc[k] = allLinesLrc[i]; k++; } //格式化歌词 for (int i = 0; i <newAllLineLrc.Length; i++) { //temp1[0]00:48.79 temp1[1]歌词 string[] temp1=newAllLineLrc[i].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries); //temp2[0]00 temp2[1]48.79 string[] temp2 = temp1[0].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); //时刻 double time = double.Parse(temp2[0]) * 60 + double.Parse(temp2[1]); //将时刻和该时刻对应歌词分别存放到对应的集合中 lrcTime.Add(time); lrcText.Add(temp1[1]); } } else { lblLrc.Text = "歌词未找到"; } }十一、音量的加减实现
private void btnAddVoice_Click(object sender, EventArgs e) { musicPlayer.settings.volume += 5; } private void btnMinus_Click(object sender, EventArgs e) { musicPlayer.settings.volume -= 5; } }遗漏了一点,初始加载时播放和暂停按钮设置不可用,应该在播放列表的当前索引发生变化时设置为可用
private void lboSongs_SelectedIndexChanged(object sender, EventArgs e) { btnPlayOrPause.Enabled = true; }基本上差不多了,看效果,最初的界面(略丑,小孩图片遮挡了WindowMediaPlayer组件)
点击打开文件,找几首歌加进歌单
双击歌曲播放
歌词显示出来了-_-
总结:
虽然东西丑了点,适合去理解C#语言的属性+时间+方法的概念,还是有点收获的!!!
- 基于WindowsMediaPlayer组件的简单播放器的设计
- 基于WindowsMediaPlayer网页播放器的设计与实现
- C#-WinForm-简单的音频播放器(基于WindowsMediaPlayer控件)(一)
- C#-WinForm-简单的音频播放器(基于WindowsMediaPlayer控件)(二)
- C# WindowsMediaPlayer 播放器
- C#基于WindowsMediaPlayer实现音视频文件播放器
- COM组件中WindowsMediaPlayer的主属性和事件用法
- 基于AVPlayer简单封装的播放器
- WMPLib.WindowsMediaPlayer 的用法
- WindowsMediaPlayer控件的使用
- WindowsMediaPlayer的用法
- WindowsMediaPlayer控件的使用
- WindowsMediaPlayer控件的使用
- WindowsMediaPlayer控件的属性
- C#WindowsMediaPlayer的属性
- winform windowsmediaplayer的属性
- C#WindowsMediaPlayer的播放列表
- 【Android】基于Service组件的简易音乐播放器
- 高德地图
- 机器视觉应用于蔬果检测方面的相关英语词汇
- [莫比乌斯反演] BZOJ 2301 [HAOI2011]Problem b
- section 1.5 sprime
- 对Too many classes in --main-dex-list,main dex capacity exceded提供简单几种方案。
- 基于WindowsMediaPlayer组件的简单播放器的设计
- css3transform动画
- hdu-5505 数论
- 九度 1104:整除问题
- hdu 5063 Operation the Sequence(思路)
- osx安装qutip备忘
- C#中的抽象类、密封类、静态类
- HDU 2888 Check Corners
- Redux 从源码开始学习(一):初探redux