版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
解析歌词:
创建一个类Lrcinfo,,声明一个数据集合,lrcid是记录歌词位置的,
class Lrcinfo
{
private int _time;
private string _lrcstr;
public int Time
{
get { return _time; }
set { _time = value; }
}
public string Lrcstr
{
get { return _lrcstr; }
set { _lrcstr = value; }
}
public Lrcinfo(int time, string lrcstr)
{
_time = time;
_lrcstr = lrcstr;
}
}
//Lrcing是一个ObservableCollection数据集合 ObservableCollection<Lrcinfo> Lrcing = new ObservableCollection<Lrcinfo>();
private void LrcParse(string _str)
{
_str = _str.Replace("[", "");
string[] _lrcstr = _str.Split('\n');
Lrcing.Clear();
for (int i = 0; i < _lrcstr.Length; i++)
{
string[] _a = (_lrcstr[i].ToString()).Split(']');//时间、歌词
string[] _b = _a[0].Split(':');//时间
_b[1] = _b[1].Replace(".", "");
if (_a.Length != 1 && _b[1].Length == 4 && _b.Length == 2 && _a[0].Length == 8)
{
int _c1, _c2, _sum;
_c1 = int.Parse(_b[0]);
_c2 = int.Parse(_b[1]);
_sum = _c2 + (_c1 * 6000);
Lrcing.Add(new Lrcinfo(_sum, _a[1]));//往数据集合中添加元素
}
}
Lrcid = 0;//全局变量 记录歌词到第句了,匹配歌词时用的到
}
匹配歌词:
用个timer就可以了
private void LrcLoop(object sender, EventArgs e)
{
if (LrcClass.IsOpen == true)//判断一下桌面歌词有没有打开,根据自己情况设置
{
int _a = (int)(MP3Player.Position.TotalMilliseconds / 10) + 25;//获取播放器时间,后面的+25是为了让歌词提前一点,可以自己设置
for (int i = Lrcid; i < Lrcing.Count; i++)//这里用上Lrcid这个变量,不用每次都从0开始匹配,提高效率
{
if (_a >= Lrcing[i].Time && i + 1 < Lrcing.Count && _a < Lrcing[i + 1].Time)
{///查找到符合条件的,不是最后一个
if (i == 0)
{///第一个
data.Counter = Lrcing[i].Lrcstr;//赋值,根据自己情况改
Lrcid = i;
}
else if (Lrcing[i].Lrcstr != "" && Lrcid != i)
{///不为空,赋值
data.Counter = Lrcing[i].Lrcstr;
Lrcid = i;
}
else if (Lrcing[i].Lrcstr == "" && Lrcid != i)
{///空,赋前一个值
data.Counter = Lrcing[i - 1].Lrcstr;
Lrcid = i;
}
break;
}
else if (i + 1 == Lrcing.Count && _a >= Lrcing[i].Time)
{///最后一个
if (Lrcing[i].Lrcstr != "")
{///最后一个非空
data.Counter = Lrcing[i].Lrcstr;
}
else
{///最后一个空
data.Counter = Lrcing[i - 1].Lrcstr;
}
Lrcid = i + 1;
break;
}
}
}
else
{
Timer2.Stop();
}
}