C#winfrom播放器动态加载歌词

上周我们进行了结业项目答辩,是播放器项目。有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子。

这里的工具是Visual Studio 2013,使用语言是C#和.net技术。

首先我们使用File.Exists(@"文件路径")判断lrc歌词文件是否存在,如果存在的话读取lrc文件。

这里可以用正则表达式,也可以用一个二维数组或两个数组。本文是用的二维数组。

lrc文件也是文本文件,一句歌词就是一行文本。简单点理解就像数据库中的DataReader,一次读取一行文本(记录),然后我们使用substring方法分别截取到文本内的时间和歌词,放到数组中。

文件大概就是这样子的。

我们读取到了之后,播放器有一个属性,Ctlcontrols.currentPositionString:string; 获取当前进度,返回一个字符串格式的值。如“00:23”

我们拿到这个值和“保存时间”的数组里的值进行匹配,判断media player播放的时间=此行时间,则让此行高亮。(用定时器一直刷新,保持同步)

如此,就可以达到像酷狗那样子歌词和歌曲同步滚播的样子了。

最后附上源代码

 1 #region 歌词
 2         string[,] lrc = new string[2, 500];//保存歌词和当前进度
 3         /// <summary>
 4         /// 读取并显示歌词
 5         /// </summary>
 6         public void ShowLrc()
 7         {
 8             if (this.axWindowsMediaPlayer2.playState == WMPLib.WMPPlayState.wmppsPlaying)
 9             {
10                 try
11                 {
12                     //using:作用是使用完成后自动释放内存
13                     //StreamReader:作用是用特定的编码从字节流中读取字节
14                     using (StreamReader sr = new StreamReader(KTVUtil.songPath + @"\" + PlayList.PlayingSongName() + ".lrc", Encoding.Default))
15                     {
16                         String line;
17                         //循环读取每一行歌词
18                         while ((line = sr.ReadLine()) != null)
19                         {
20                             //将读取到的歌词存放到数组中
21                             for (int i = 0; i < 500; i++)
22                             {
23                                 if (lrc[0, i] == null)
24                                 {
25                                     lrc[0, i] = line.Substring(10, line.Length - 10);
26                                     break;
27                                 }
28                             }
29                             //将读取到的歌词时间存放到数组中
30                             for (int i = 0; i < 500; i++)
31                             {
32                                 if (lrc[1, i] == null)
33                                 {
34                                     lrc[1, i] = line.Substring(1, 5);
35                                     break;
36                                 }
37                             }
38                         }
39                         /***********动态显示歌词***************/
40                         //获取播放器当前进度
41                         string numss = this.axWindowsMediaPlayer2.Ctlcontrols.currentPositionString;
42                         for (int i = 0; i < 500; i++)
43                         {
44                             if (lrc[1, i].Equals(numss))
45                             {
46                                 this.lblLrc.Text = lrc[0, i];
47                             }
48                             //else
49                             //{
50                             //    this.lblLrc.Text = "************";
51                             //}
52                         }
53                     }
54                 }
55                 catch (Exception ex)
56                 {
57                     //MessageBox.Show("异常:" + ex.Message);
58                 }
59             }
60         }
61         /// <summary>
62         /// 刷新歌词
63         /// </summary>
64         /// <param name="sender"></param>
65         /// <param name="e"></param>
66         private void timer5_Tick(object sender, EventArgs e)
67         {
68             ShowLrc();
69         }
70         #endregion

ps.大家有好的建议欢迎提出:)

时间: 2024-10-16 06:15:23

C#winfrom播放器动态加载歌词的相关文章

使用js加载器动态加载外部Javascript文件

今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 MiniSite.Browser={ 6 ie:/msie/.test(window.navigator.userAgent.toLowerCase()), 7 moz:/gecko/.test(window.navigator.userAgent.toLowerCase()), 8 opera:/o

苹果cms如何添加播放器预加载和缓冲广告

1,来到系统后台>>系统>>播放器参数设置  可以看到添加预加载和缓冲广告的输入框.文件格式为html 自己写一个html的网页上传到网站进行调用即可.链接前面不要加http或是htpps .还可以设置预加载广告的时长. 2,如果不会写html广告单页的话可以参照下面的简单模板来填写下,首先在桌面新建一个txt文本把这些代码复制到文本里面从“①填写自己要加载的网址”开始修改到⑥图片高度,图片边框,高度和宽度数值填写为0-1000的数字.修改完后把txt文本格式修改为html格式即可

类加载器(DexClassLoader)与插件化(动态加载)

类加载器与插件化解析 2.1 类装载器 DexClassLoader 首先,我们需要了解关于java代码本地import的一些知识: import中所引用的类有两个特点: 1.必须存在于本地,当程序运行时需要该类时,内部类装载器会自动装载该类,这对程序员来讲是透明的,即程序员感知不到该过程 2.编译时必须在现场,否则编译过程会因为找不到引用文件而不能正常编译. 使用ClassLoader的必要说明,多用于动态加载一些自定义的类. 一般情况下,应用程序不需要创建一个全新的ClassLoader,而

加载歌词代码

ios 开发 学习记录 编写音乐播放器: 获取歌词的思路 : 加载歌词: 歌词加载方法: //此方法是通过路径拿到歌词将其取出 NSString *lrcPath(自己定义的字符串变量名) = [[NSBundle mainBundle] pathForResource: 歌曲数组[索引] ofType:@"lrc"];//歌词格式 //此方法是将歌词的格式转换成Xcode支持的格式 NSString *contentStr = [NSString stringWithContents

页面滚动图片等元素动态加载插件jquery.scrollLoading.js

如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的就不用加载了.这样还可以在一定程度上节省服务器资源.该插件作者的网页将该插件的功能和使用方法描述的非常详细,这里把最一般最普遍的使用情况给大家展现一下. 插件作者:http://www.zhangxinxu.com/ 首先我们需要加载jQuery库和本插件js文件. (jquery.scrollLo

Struts2的国际化(二)-利用超链接实现动态加载国际化资源文件

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 ! 由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道. 具体确定 Locale 对象的过程: > Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中 > i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数. 如果该参

实现Android 动态加载APK(Fragment or Activity实现)

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 最近由于项目太大了,导致编译通不过(Android对一个应用中的方法个数貌似有限制),所以一直琢磨着能否将某些模块的APK不用安装,动态加载,通过在网上查找资料和网友的帮助,终于实现了APK的动态加载,网络上介绍APK动态加载的文章非常多,但是我觉得写得非常好的就是这位大牛的,我基本上就是使用他的这种方案,然后加入了自己的元素.这位大牛是通过Activity实现的,我稍作修改

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

【转】Android类动态加载技术

http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件:如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防