详情页

php 将lrc文件的歌词转换为str字幕

时间:2023年10月22日

编辑:佚名

该函数是一段将歌词文件转换为SRT字幕文件的PHP代码。具体实现过程如下:
去除多余的空白行,使用正则表达式 preg_replace("/^\s*$/m", "", $lrc)。
将歌词文本按行分割,使用 explode("\n", $lrc)。
循环每一行歌词内容,使用正则表达式 preg_match_all("/\[(\d{2}):(\d{2})(?:\.(\d{2,3}))?\]/", $lines[$i], $matches) 匹配时间标签和歌词内容。
如果匹配到时间标签,则获取开始时间和结束时间。其中,若歌词内容直接跟在最后一个时间标签之后的情况,需要根据下一行的时间标签计算结束时间;否则,将结束时间设为开始时间+5秒。
根据开始和结束时间以及歌词内容构建SRT字幕内容,并将其存入 $srt 字符串中。
返回 $srt 字符串。
这个函数的主要作用是将 LRC 格式的歌词转换为 SRT 格式的字幕,以便于在视频播放器中显示歌词。
代码:
function lrc2srt($lrc) {
    // print_r($lrc);
    // 去除多余的空白行
    $lrc = preg_replace("/^\s*$/m", "", $lrc);
    
    // 按行分割
    $lines = explode("\n", $lrc);
    $count = count($lines);
    // print_r($lines);
    $srt = '';
    $index = 1;
    for ($i = 0; $i < $count; $i++) {
        // 匹配时间标签和歌词内容
        preg_match_all("/\[(\d{2}):(\d{2})(?:\.(\d{2,3}))?\]/", $lines[$i], $matches);
        // print_r($matches);
        if (!empty($matches[0])) {
            // 获取时间标签
            $startHour = intval($matches[1][0]);
            $startMinute = intval($matches[2][0]);
            $startSecond = intval($matches[3][0]);
            // $startTime = sprintf("%02d:%02d:%02d,%03d", 0,$startHour, $startMinute, $startSecond);
            $startTime = sprintf('%02d:%02d:%02d,%03d', 0, $startHour, $startMinute, $startSecond * 10);
            // 获取歌词内容
            if (strpos($lines[$i], ']') === false) {
                // 特殊情况:歌词内容直接跟在最后一个时间标签之后的情况
                $lyric = trim(substr($lines[$i], strlen($matches[0][0])));
                if ($i < $count - 1 && strpos($lines[$i + 1], '[') !== false) {
                    // 下一行是新的时间标签,计算结束时间
                    preg_match_all("/\[(\d{2}):(\d{2})(?:\.(\d{2,3}))?\]/", $lines[$i + 1], $nextMatches);
                    $endHour = intval($nextMatches[1][0]);
                    $endMinute = intval($nextMatches[2][0]);
                    $endSecond = intval($nextMatches[3][0]);
                } else {
                    // 下一行无新的时间标签,将结束时间设为开始时间+5秒
                    $endHour = $startHour;
                    $endMinute = $startMinute;
                    $endSecond = $startSecond + 5;
                }
            } else {
                $lyric = trim(preg_replace("/\[(\d{2}):(\d{2})(?:\.(\d{2,3}))?\]/", "", $lines[$i]));
                // 获取下一行的时间标签
                preg_match_all("/\[(\d{2}):(\d{2})(?:\.(\d{2,3}))?\]/", $lines[$i + 1], $nextMatches);
                if (!empty($nextMatches[0])) {
                    // 计算结束时间
                    $endHour = intval($nextMatches[1][0]);
                    $endMinute = intval($nextMatches[2][0]);
                    $endSecond = intval($nextMatches[3][0]);
                } else if ($i !== $count - 1) {
                    // 下一行无时间标签,将结束时间设为开始时间+5秒
                    $endHour = $startHour;
                    $endMinute = $startMinute;
                    $endSecond = $startSecond + 5;
                }
            }
            // 计算结束时间
            // $endTime = sprintf("%02d:%02d:%02d,%03d", 0, $endHour, $endMinute, $endSecond);
            $endTime = sprintf('%02d:%02d:%02d,%03d', 0, $endHour, $endMinute, ($endSecond - 5) * 10);
            if(!empty($lyric)){
                // 构建SRT字幕内容
                $srt .= $index . "\n";
                $srt .= $startTime . ' --> ' . $endTime . "\n";
                $srt .= $lyric . "\n\n";
    
                $index++;
            }
        }
    }
    return $srt;
}
}
相关文章
猜你需要