【C#】解析歌词和匹配歌词

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_19764639/article/details/98486844

解析歌词:

创建一个类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();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_19764639/article/details/98486844