QT 加载歌词LRC文件

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值