欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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换行符结尾为一段 这样去解析.