SRT字幕和LRC歌词怎么互转?一篇说明白

两种格式看着像,但混着用就会乱码错位。花5分钟搞清楚区别,以后再也不用手动改时间轴了。

一、先看区别:SRT是给视频用的,LRC是给音乐用的

很多人第一次接触SRT和LRC,会觉得它们差不多——都是文本文件,都有时间轴,都是一行时间一行内容。但如果你把两个字幕文件互相改名直接套用,大概率会出问题。

先说SRT。它是给视频字幕用的,最早来自DVD抓轨。SRT最大的特点是每句字幕有独立的序号,而且时间轴精确到毫秒。一个标准的SRT文件长这样:

1 00:00:15,200 --> 00:00:18,600 你吃饭了吗? 2 00:00:19,000 --> 00:00:22,500 吃过了,你呢?

注意时间格式:小时:分钟:秒,毫秒。中间用逗号分隔毫秒,箭头表示显示的时间段。每段字幕之间必须有一个空行,播放器靠这个空行来区分每一句。

再说LRC。它是给歌词用的,最早出现在千千静听那个年代。LRC没有序号,时间轴前面加个中括号就行,精确到百分之一秒(也有精确到毫秒的变种)。一个标准的LRC文件长这样:

[ti:歌名] [ar:歌手] [al:专辑] [00:15.20]你吃饭了吗? [00:19.00]吃过了,你呢?

LRC最大的不同是:它可以有标签行(比如ti表示歌名,ar表示歌手),而且同一时间可以有多行歌词(比如合唱部分)。另外LRC还有一种逐字歌词的变体,时间轴精度更高,但那又是另一回事了。

🎯 一句话总结区别

SRT是“一段话显示一段时间”,LRC是“一句话在某个时间点出现”。前者关注持续显示,后者关注精确触发。这个差别直接决定了它们不能直接互相替换。

二、什么情况下需要互转?

虽然两种格式定位不同,但实际使用中经常需要互转。常见的有这么几种情况:

🎬 SRT转LRC

  • 把电影台词做成歌词:你有一段电影的经典对白,想做成LRC歌词文件,方便在音乐播放器里跟着看。
  • 播客转音频带字幕:很多播客节目有SRT字幕,你想把音频导出来配上LRC歌词,让听众在车上也能看到文本。
  • 教学视频转听力材料:英语教学视频的SRT字幕,转成LRC后配合MP3做听力训练,可以逐句跟读。

🎵 LRC转SRT

  • 把歌词做成视频字幕:你有一首喜欢的歌和LRC歌词,想做成MV字幕,需要转成SRT才能压制进视频。
  • 导入剪辑软件:Premiere、剪映这类软件对SRT支持最好,LRC基本不认,必须转换。
  • 上传到视频平台:B站、YouTube上传字幕只认SRT或VTT,LRC直接上传会报错。

从实际需求来看,LRC转SRT的场景更多一些。因为视频平台和剪辑软件对SRT的支持是标配,而LRC基本只在音乐播放器里能用。

三、转换方法:从手工到批量

转换的核心只有一个:时间格式的互相换算。SRT用时:分:秒,毫秒,LRC用[分:秒.百分秒]。搞定了时间格式,剩下就是增删序号和标签的事。

方法一:在线工具(最快,适合偶尔用)

如果只是偶尔转一两个文件,直接用在线工具最省事。搜索“SRT LRC 在线转换”能找到一堆。推荐几个靠谱的:

  • Subtitle Tools:界面干净,支持批量,没有文件大小限制。
  • Convertio:功能全,但免费版有限制。
  • Online-Convert:老牌网站,稳定但广告多。

在线工具的缺点是:文件大了会慢,而且歌词里的标签行(ti、ar这些)经常被忽略。如果你需要保留歌手、专辑信息,最好用下面的方法。

方法二:用Aegisub或Subtitle Edit(推荐,功能最全)

Aegisub是字幕组常用的工具,免费开源。虽然界面有点老,但转换功能很靠谱:

  • 打开Aegisub,直接把SRT或LRC拖进去。
  • 点“文件” → “导出字幕” → 选择目标格式。
  • 如果是LRC转SRT,Aegisub会自动补上序号,每句字幕的结束时间默认是下一句的开始时间。
  • 如果是SRT转LRC,需要手动调整一下结束时间(LRC没有结束时间的概念,转换后每句歌词会按SRT的开始时间输出)。

Subtitle Edit是另一个好用的工具,界面更现代,支持批量转换,Windows和Mac都能用。它的“批量转换”功能可以一次处理几十个文件,适合有大量转换需求的人。

方法三:自己写脚本(适合程序员,完全可控)

如果你会一点Python,写个转换脚本最灵活。下面给两个核心函数,分别处理两种转换:

# SRT 转 LRC def srt_to_lrc(srt_content): import re lines = srt_content.strip().split('\n') lrc_lines = [] for i in range(0, len(lines), 4): # SRT每4行一组 if i+2 >= len(lines): break time_line = lines[i+1] text_line = lines[i+2] # 提取开始时间,格式 00:00:15,200 start = re.search(r'(\d{2}:\d{2}:\d{2}),(\d{3})', time_line) if start: # 转换为 LRC 格式 [分钟:秒.百分秒] h, m, s = start.group(1).split(':') ms = int(start.group(2)) // 10 # 毫秒转百分秒 lrc_time = f"[{int(m):02d}:{int(s):02d}.{ms:02d}]" lrc_lines.append(f"{lrc_time}{text_line}") return '\n'.join(lrc_lines) # LRC 转 SRT def lrc_to_srt(lrc_content): import re lines = lrc_content.strip().split('\n') srt_lines = [] index = 1 for i, line in enumerate(lines): # 匹配 LRC 时间格式 [00:15.20] match = re.search(r'\[(\d{2}):(\d{2})\.(\d{2})\]', line) if match: m, s, cs = match.groups() text = re.sub(r'\[.*?\]', '', line).strip() if not text: continue # 转换为 SRT 时间格式 00:00:15,200 start_time = f"00:{int(m):02d}:{int(s):02d},{int(cs)*10:03d}" # 结束时间:如果下一行有时间就用下一行的开始,否则加3秒 end_match = None if i+1 < len(lines): end_match = re.search(r'\[(\d{2}):(\d{2})\.(\d{2})\]', lines[i+1]) if end_match: em, es, ecs = end_match.groups() end_time = f"00:{int(em):02d}:{int(es):02d},{int(ecs)*10:03d}" else: # 没有下一行就默认加3秒 h, m, s = 0, int(m), int(s) total_sec = h*3600 + m*60 + s + 3 nh = total_sec // 3600 nm = (total_sec % 3600) // 60 ns = total_sec % 60 end_time = f"{nh:02d}:{nm:02d}:{ns:02d},000" srt_lines.append(str(index)) srt_lines.append(f"{start_time} --> {end_time}") srt_lines.append(text) srt_lines.append('') index += 1 return '\n'.join(srt_lines)
注意:上面的脚本只处理了最基础的情况。实际使用中你可能需要处理SRT里毫秒是逗号还是点号、LRC里的标签行、逐字歌词等特殊情况。建议先用小文件测试,确认没问题再批量处理。

四、转换中常见的坑

转换多了就会发现一些规律性的问题。下面这几个是最常遇到的:

🕐 坑一:时间格式不统一

SRT有的用逗号分隔毫秒(标准),有的用点号(某些欧洲软件)。LRC有的用百分秒,有的直接精确到毫秒。转换前最好先统一格式,否则解析会出错。

解决办法:写脚本时同时匹配逗号和点号;LRC时间不管百分秒还是毫秒,都按数字处理。

📏 坑二:SRT转LRC后时间不准

SRT每句有开始和结束时间,但LRC只有开始时间。转换时如果直接丢掉结束时间,后面的歌词时间就会乱。比如SRT里第一句是00:15到00:18,第二句是00:19开始,直接转LRC后两句话就变成15秒和19秒,中间有1秒空白,听起来很奇怪。

解决办法:转LRC时,把结束时间存下来,用来判断下一句是否应该提前。或者用SRT的结束时间作为LRC的下一句开始。

🔤 坑三:编码乱码

老一点的SRT文件很多是ANSI编码(GB2312),LRC也类似。但现代播放器基本都用UTF-8。混用编码会导致中文乱码。

解决办法:转换前统一转成UTF-8。用记事本打开另存为UTF-8,或者脚本里加一行.encode('utf-8')

💡 一个实用建议

如果你经常做转换,建议保留原始文件。因为转换过程不可逆——SRT转LRC会丢失结束时间,LRC转SRT的结束时间是推算的,不一定准确。保留原文件,随时可以重新转。

五、总结

SRT和LRC的互转,技术上不难,核心就是时间格式换算。但实际用的时候,因为两种格式的设计目标不同,总会有一些细节对不上。比如LRC没有结束时间,转换时怎么补?SRT有字幕序号,LRC没有,转过去后序号丢了影不影响?这些问题没有标准答案,取决于你用在哪里。

如果你只是偶尔转一两个文件,用在线工具最省事。如果经常转或者对精度有要求,花半小时学一下Aegisub或写个简单的脚本,一劳永逸。

最后提醒:不管用什么方法转,转完最好用播放器放一遍,肉眼扫一下时间对不对。时间轴错了的话,转出来的文件还不如不转。

参考资料

  • LRC歌词格式规范(非官方标准,来自千千静听时代约定)
  • SubRip (.srt) 字幕格式说明 - Matroska 文档
  • Aegisub 官方文档 - 字幕格式转换章节