C\#Lrc 가사 파일 해석 과정 상세 설명
우선 Lrc 파일 을 알 아 보 겠 습 니 다.
시간 형식:
1.표준 형식:[분:초.밀리초]가사
주석:괄호,사칭,점 호 는 모두 영어 입력 상 태 를 요구 합 니 다.
2.기타 형식 ①:[분:초]가사;
3.기타 형식 ②:[분:초:밀리초]가 사 는 표준 형식 에 비해 초 뒤의 점 호 는 콜론 으로 바 뀌 었 다.
표준 형식:
그 형식 은'[표지 명:값]'이다.대소 문자 등가.다음은 미리 정 의 된 탭 입 니 다.
[ar:연예인 명]
[ti:곡 명]
[al:앨범 명]
[by:편집자(LRC 가 사 를 편집 하 는 사람 을 가리 키 는 말)]
[offset:시간 보상 치]그 단 위 는 밀리초 이 고 정 치 는 전체 가 앞 당 겨 지고 마이너스 가 반대 임 을 나타 낸다.이것 은 디 스 플레이 속 도 를 전체적으로 조정 하 는 데 쓰 인 다.
기준 이 좋 군요.기준 에 따라 하 겠 습 니 다.
public class Lrc
{
/// <summary>
///
/// </summary>
public string Title { get; set; }
/// <summary>
///
/// </summary>
public string Artist { get; set; }
/// <summary>
///
/// </summary>
public string Album { get; set; }
/// <summary>
///
/// </summary>
public string LrcBy { get; set; }
/// <summary>
///
/// </summary>
public string Offset { get; set; }
/// <summary>
///
/// </summary>
public Dictionary<double, string> LrcWord = new Dictionary<double, string>();
/// <summary>
///
/// </summary>
/// <param name="LrcPath"> </param>
/// <returns> (Lrc )</returns>
public static Lrc InitLrc(string LrcPath)
{
Lrc lrc = new Lrc();
using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
string line;
using (StreamReader sr = new StreamReader(fs, Encoding.Default))
{
while ((line = sr.ReadLine()) != null)
{
if (line.StartsWith("[ti:"))
{
lrc.Title = SplitInfo(line);
}
else if (line.StartsWith("[ar:"))
{
lrc.Artist = SplitInfo(line);
}
else if (line.StartsWith("[al:"))
{
lrc.Album = SplitInfo(line);
}
else if (line.StartsWith("[by:"))
{
lrc.LrcBy = SplitInfo(line);
}
else if (line.StartsWith("[offset:"))
{
lrc.Offset = SplitInfo(line);
}
else
{
Regex regex = new Regex(@"\[([0-9.:]*)\]+(.*)", RegexOptions.Compiled);
MatchCollection mc = regex.Matches(line);
double time = TimeSpan.Parse("00:" + mc[0].Groups[1].Value).TotalSeconds;
string word = mc[0].Groups[2].Value;
lrc.LrcWord.Add(time, word);
}
}
}
}
return lrc;
}
/// <summary>
/// ( )
/// </summary>
/// <param name="line"></param>
/// <returns> </returns>
static string SplitInfo(string line)
{
return line.Substring(line.IndexOf(":") + 1).TrimEnd(']');
}
}
한 줄 코드:Lrc lrc=Lrc.InitLrc("test.lrc"); 분 리 된 가 사 를 Dictionary
테스트:
옛날 에 어떤 사람 이 이 문 제 를 제기 했다.한 줄 의 가사 에 여러 시간 이 잘못 보 고 될 수 있 고 이렇게 오 랜 시간 이 지나 도 좋 은 방안 을 제공 하 는 사람 이 없 었 다.오늘 나 는 시간 을 좀 써 서 수정 했다.다음은 가 사 를 얻 는 방법 이다.
/// <summary>
///
/// </summary>
/// <param name="LrcPath"> </param>
/// <returns> (Lrc )</returns>
public static Lrc InitLrc(string LrcPath)
{
Lrc lrc = new Lrc();
Dictionary<double, string> dicword = new Dictionary<double, string>();
using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
string line;
using (StreamReader sr = new StreamReader(fs, Encoding.Default))
{
while ((line = sr.ReadLine()) != null)
{
if (line.StartsWith("[ti:"))
{
lrc.Title = SplitInfo(line);
}
else if (line.StartsWith("[ar:"))
{
lrc.Artist = SplitInfo(line);
}
else if (line.StartsWith("[al:"))
{
lrc.Album = SplitInfo(line);
}
else if (line.StartsWith("[by:"))
{
lrc.LrcBy = SplitInfo(line);
}
else if (line.StartsWith("[offset:"))
{
lrc.Offset = SplitInfo(line);
}
else
{
try
{
Regex regexword = new Regex(@".*\](.*)");
Match mcw = regexword.Match(line);
string word = mcw.Groups[1].Value;
Regex regextime = new Regex(@"\[([0-9.:]*)\]", RegexOptions.Compiled);
MatchCollection mct = regextime.Matches(line);
foreach (Match item in mct)
{
double time = TimeSpan.Parse("00:" + item.Groups[1].Value).TotalSeconds;
dicword.Add(time, word);
}
}
catch
{
continue;
}
}
}
}
}
lrc.LrcWord = dicword.OrderBy(t => t.Key).ToDictionary(t => t.Key, p => p.Value);
return lrc;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.