C#winfrom播放器动态加载歌词
上周我们进行了结业项目答辩,是播放器项目。有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子。
这里的工具是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播放器动态加载歌词的更多相关文章
- 使用js加载器动态加载外部Javascript文件
原文:http://www.cnblogs.com/xdp-gacl/p/3927417.html 今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js var ...
- JavaScript学习总结(十九)——使用js加载器动态加载外部Javascript文件
今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 M ...
- 使用js加载器动态加载外部js、css文件
let MiniSite = new Object(); /** * 判断浏览器 */ MiniSite.Browser = { ie: /msie/.test(window.navigator.us ...
- 苹果cms如何添加播放器预加载和缓冲广告
1,来到系统后台>>系统>>播放器参数设置 可以看到添加预加载和缓冲广告的输入框.文件格式为html 自己写一个html的网页上传到网站进行调用即可.链接前面不要加http或 ...
- winfrom 界面时间动态加载
Timer time1 = new Timer(); private void time1_Tick(object sender, EventArgs e) { lTime.Text = DateTi ...
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- 动态加载框架DL分析
动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
- 关于实现Extjs动态加载类的方式实现
Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...
随机推荐
- Oracle管理磁盘空间和资源
1.可恢复的空间分配 2.可移动表空间 3.Oracle段收缩功能 4.Oracle数据库资源管理 Reference 1.可恢复的空间分配 1.1 了解可恢复的空间分配 一般情况,我们发出一个大型数 ...
- spring笔记--事务管理之声明式事务
事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...
- Solr学习总结(三)Solr web 管理后台
前面讲到了Solr的安装,按道理,这次应该讲讲.net与数据库的内容,C#如何操作Solr索引等.不过我还是想先讲一些基础的内容,比如solr查询参数如何使用,各个参数都代表什么意思? 还有solr ...
- Android APP压力测试(二)之Monkey信息自动收集脚本
Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...
- HTML特殊符号汇总
较常用的飘黄处理了 ´ ´ © © > > µ µ ® ® & & ° ° ¡ ¡ » » ¦ ¦ ÷ ÷ ¿ ¿ ¬ ¬ § § • • ½ ½ « « ¶ ¶ ¨ ...
- react入门(2)
接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...
- gitlab工作流程简介
gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...
- Xamarin.Android之简单的抽屉布局
0x01 前言 相信对于用过Android版QQ的,应该都不会陌生它那个向右滑动的菜单(虽说我用的是Lumia) 今天就用Xamarin.Android实现个比较简单的抽屉布局.下面直接进正题. 0x ...
- 【Win10开发】Toast通知——前台激活
上篇文章我们将了大体的Toast通知的模板及实例展示,那么,这篇文章就来讲讲Toast的前台激活. 首先是xaml界面,很简单,我们放一个Button和TextBlock,TextBlock用来显示T ...
- C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
// 获取程序的基目录.System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径,包含文件名System.Diagnostics.Proces ...