首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

酷狗 KRC 歌詞解析與 LRC 轉換:PHP 完整實現方案

     編輯:PHP 相關知識

酷狗音樂採用專有 KRC 格式 歌詞(加密壓縮),本文從 Flash 播放器逆向分析出解密算法,提供完整 PHP 解析與 LRC 轉換代碼。

核心解密算法(ActionScript 逆向)

public function loaderCompleteHandler(param1:ByteArray) : void {
    this.newkeyBytes = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105];
    var result:* = param1;
    var krcBytes:* = new ByteArray();
    result.position = 4;
    result.readBytes(krcBytes);
    var l:* = krcBytes.length;
    var i:int;
    while (i < l) {
        krcBytes[i] = krcBytes[i] ^ this.newkeyBytes[i % this.newkeyBytes.length];
        i = (i + 1);
    }
    try { krcBytes.uncompress(); } catch (error:SecurityError) { return; }
    krcBytes.position = 0;
    this.myLyric.dataStr = krcBytes.readUTFBytes(krcBytes.length);
}

PHP 解密實現

$enKey = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105];
$krc_content = substr($krc_content, 4); // 跳過前4字節
$len = strlen($krc_content);
$krc_compress = '';
for ($k = 0; $k < $len; $k++) {
    $krc_compress .= chr(ord($krc_content[$k]) ^ $enKey[$k % 16]);
}
$krc_text = gzuncompress($krc_compress); // 解壓獲取明文 KRC

KRC 轉 LRC 完整函數

function krc2lrc($krc_content, $glue = "\n") {
    $enKey = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105];
    $krc_content = substr($krc_content, 4);
    $len = strlen($krc_content);
    $krc_compress = '';
    for ($k = 0; $k < $len; $k++) {
        $krc_compress .= chr(ord($krc_content[$k]) ^ $enKey[$k % 16]);
    }
    $krc_text = gzuncompress($krc_compress);

    // 提取元數據 [ar:...][ti:...][offset:...]
    preg_match_all("/\[(ar|ti|offset):(.+)\]/", $krc_text, $matches);
    $lrc_text = implode($glue, $matches[0]) . $glue;

    // 提取歌詞行 [時間戳,時長]內容
    preg_match_all("/\[(\d{0,8}),(\d{0,8})\](.+)/", $krc_text, $matches);
    unset($krc_text, $krc_compress, $krc_content, $enKey);

    if (!empty($matches[1])) {
        foreach ($matches[1] as $k => $v) {
            list($seconds, $millis) = explode('.', $v / 1000);
            $lrc_time = date('i:s', 1388534400 + $seconds) . '.' . substr($millis, 0, 2);
            $lrc_cont = preg_replace("/<\d{1,8},\d{1,8},\d{1,8}>/", '', $matches[3][$k]);
            $lrc_text .= "[{$lrc_time}]{$lrc_cont}{$glue}";
        }
    }
    return $lrc_text;
}

使用範例

$content = file_get_contents('1.krc');
echo krc2lrc($content, '
');

關鍵技術點

  • 異或解密:16 字節金鑰循環異或
  • gzuncompress:解壓 zlib 壓縮數據
  • 時間戳轉換:KRC 毫秒級時間戳 → LRC 分:秒.毫秒格式
  • 逐字標記清理:移除 <開始,結束,顏色> 等 KRC 專有標記

應用場景

  • 音樂播放器歌詞顯示
  • 歌詞數據遷移與歸檔
  • 第三方歌詞服務整合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved