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

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

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

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

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

文件大概就是这样子的。

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

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

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

最后附上源代码

 #region 歌词
string[,] lrc = new string[, ];//保存歌词和当前进度
/// <summary>
/// 读取并显示歌词
/// </summary>
public void ShowLrc()
{
if (this.axWindowsMediaPlayer2.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
try
{
//using:作用是使用完成后自动释放内存
//StreamReader:作用是用特定的编码从字节流中读取字节
using (StreamReader sr = new StreamReader(KTVUtil.songPath + @"\" + PlayList.PlayingSongName() + ".lrc", Encoding.Default))
{
String line;
//循环读取每一行歌词
while ((line = sr.ReadLine()) != null)
{
//将读取到的歌词存放到数组中
for (int i = ; i < ; i++)
{
if (lrc[, i] == null)
{
lrc[, i] = line.Substring(, line.Length - );
break;
}
}
//将读取到的歌词时间存放到数组中
for (int i = ; i < ; i++)
{
if (lrc[, i] == null)
{
lrc[, i] = line.Substring(, );
break;
}
}
}
/***********动态显示歌词***************/
//获取播放器当前进度
string numss = this.axWindowsMediaPlayer2.Ctlcontrols.currentPositionString;
for (int i = ; i < ; i++)
{
if (lrc[, i].Equals(numss))
{
this.lblLrc.Text = lrc[, i];
}
//else
//{
// this.lblLrc.Text = "************";
//}
}
}
}
catch (Exception ex)
{
//MessageBox.Show("异常:" + ex.Message);
}
}
}
/// <summary>
/// 刷新歌词
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer5_Tick(object sender, EventArgs e)
{
ShowLrc();
}
#endregion

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

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

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

    原文:http://www.cnblogs.com/xdp-gacl/p/3927417.html 今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js var ...

  2. JavaScript学习总结(十九)——使用js加载器动态加载外部Javascript文件

    今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 M ...

  3. 使用js加载器动态加载外部js、css文件

    let MiniSite = new Object(); /** * 判断浏览器 */ MiniSite.Browser = { ie: /msie/.test(window.navigator.us ...

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

    1,来到系统后台>>系统>>播放器参数设置  可以看到添加预加载和缓冲广告的输入框.文件格式为html 自己写一个html的网页上传到网站进行调用即可.链接前面不要加http或 ...

  5. winfrom 界面时间动态加载

    Timer time1 = new Timer(); private void time1_Tick(object sender, EventArgs e) { lTime.Text = DateTi ...

  6. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  7. 动态加载框架DL分析

    动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...

  8. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  9. 关于实现Extjs动态加载类的方式实现

    Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...

随机推荐

  1. C语言 第五章 循环结构练习

    一.计算15+16+17 …98+99的和 for实现 #include "stdio.h" void main() { //15+16+17 …98+99 ; ;i<=;i ...

  2. 记录一则RMAN备份策略修正案例

    背景:在给某客户处理问题时,发现客户数据库的备份空间即将用尽,进一步查看发现是用户数据库的当前RMAN备份策略存在潜在问题,需要修改备份策略. 环境:SunOS 5.10 + Oracle 11.2. ...

  3. 软件工程-构建之法 理解C#一小段程序

    一.前言 老师给出的要求: 阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长 ...

  4. Your account already has a valid iOS Distribution certificate!

    iOS 发布提交出现:Your account already has a valid iOS Distribution certificate!问题解决 转载的链接   http://www.jia ...

  5. 常见的几个meta标签元素

    1.指定字符集: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/& ...

  6. Ionic2学习笔记(6):Navigation

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5551535.html           Ionic2中创建一个页面很方便,在页面之间相互切换也很方 ...

  7. SQL Server 2005 数据库 可疑状态

    KJDY数据库名称 ALTER DATABASE KJDY SET EMERGENCY ---修改数据库为 紧急模式 ALTER DATABASE KJDY SET SINGLE_USER ---单用 ...

  8. Android的系统服务一览

    System_Server进程 运行在system server进程中的服务比较多,这是整个Android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服 ...

  9. C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。

    C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...

  10. MySQL 相关总结

    MySQL 优秀在线教程 RUNOOB-SQL 教程 MySQL 常用命令 导出操作 -- 某数据库 全部表 结构和数据 mysqldump -h192.168.8.152 -uroot -p man ...