QT 加载歌词LRC文件
程序员文章站
2022-06-21 15:06:19
...
QString lrcPath = path.mid(0, path.lastIndexOf(".")) + QString(".lrc"); // 歌曲文件路径转lrc路径
QFile file(lrcPath);
if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
QTextStream stream(&file);
// stream.setCodec(QTextCodec::codecForName(“UTF-8”));
QString readStr = stream.readAll();
QRegularExpression rex("\\[(\\d+)?:(\\d+\\.\\d+)?\\]"); // 正则表达式
QRegularExpressionMatch match = rex.match(readStr);
readStr = readStr.mid(match.capturedStart(), readStr.length() - match.capturedStart()); // 去掉 匹配到的第一个时间戳前的无用字符串
while(true)
{
LrcFormat lrc;
lrc.ms = static_cast<unsigned int>((match.captured(1).toInt() * 60000 + match.captured(2).toDouble() * 1000)); // 毫秒
lrc.lrc = readStr.mid(match.capturedLength(), readStr.indexOf("\n") - match.capturedLength() + 1).simplified(); // 歌词
readStr = readStr.mid(readStr.indexOf("\n") + 1, readStr.length() - readStr.indexOf("\n")); // 截取 已解析的字符串
match = rex.match(readStr);
lrclist.append(lrc); // QVector<LrcFormat> 结构体容器
if( readStr.indexOf("\n") < 0 ) // 结尾
{
LrcFormat end;
end.ms = static_cast<unsigned int>((match.captured(1).toInt() * 60000 + match.captured(2).toDouble() * 1000));
end.lrc = readStr.mid(match.capturedLength(), readStr.indexOf("\n") - match.capturedLength() + 1).simplified();
lrclist.append(end);
break;
}
}
file.close();
}
// 结构体
typedef struct _tLrcFormat
{
unsigned int ms;
QString lrc;
} LrcFormat;
LRC处理比较困难的地方 主要是 很多人不会使用、不了解正则表达式
也有不用正则表达式的处理方式, 就是找[ 符号, 从 [ 符号开始, 到\n换行符结尾为一段 这样去解析.
上一篇: 深入浅出Pytorch打卡二
下一篇: 深入浅出java多线程