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;
}
}
去除多余的空白行,使用正则表达式 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;
}
}
新闻资讯 更多
- 【建站知识】查询nginx日志状态码大于400的请求并打印整行04-03
- 【建站知识】Python中的logger和handler到底是个什么?04-03
- 【建站知识】python3拉勾网爬虫之(您操作太频繁,请稍后访问)04-03
- 【建站知识】xpath 获取meta里的keywords及description的方法04-03
- 【建站知识】python向上取整以50为界04-03
- 【建站知识】scrapy xpath遇见乱码解决04-03
- 【建站知识】scrapy爬取后中文乱码,解决word转为html 时cp1252编码问题04-03
- 【建站知识】scrapy采集—爬取中文乱码,gb2312转为utf-804-03