MP3 的 LRC 歌词怎么写?时间标签语法、offset 整体校正与 lrclib API 实测
MP3 本身并不强制携带歌词,所谓"LRC 歌词"其实是一个独立的纯文本文件,靠同名规则与播放器的时间轴对齐来实现滚动显示。本文给出 LRC 的完整语法、用 lrclib.net 公开 API 实测抓取的一条真实歌词,以及"歌词对不上"的根因和修正办法。

一、LRC 只是一个带时间标签的文本文件
扩展名 .lrc,UTF-8 或 GBK 编码,每行以中括号时间标签开头。最小合法格式:
[00:24.25] You came unto my life
结构是 [mm:ss.xx],秒后面两位是百分秒,也有三位的毫秒写法。多个标签可叠加在同一行,如 [00:10.00][01:20.00] 副歌,用于重复段落。除了逐行标签,还有元信息标签:
[ti:歌曲名]、[ar:歌手]、[al:专辑]、[by:制作者]、[offset:+/- 毫秒]
offset 是最实用的字段:整首歌统一提前或延后若干毫秒时,改这一行即可,不用逐行重打时间。
二、真实样本:一次 API 调用的结果
lrclib.net 是一个免费开源的歌词数据库,首页实测返回 200,标题为 LRCLIB。它提供 JSON 接口,本次实测调用:
https://lrclib.net/api/search?track_name=Sorry → 200,返回 20 条记录。每条对象的字段实测为:id, name, trackName, artistName, albumName, duration, instrumental, hasWordSync, plainLyrics, syncedLyrics, lyricsfile。
取其中一条的 syncedLyrics(共 814 字符、含 24 个时间标签),开头为:
[00:24.25] You... you came unto my life[00:28.72] Just like a sunny day[00:32.72] Sory's far away[00:55.91] Sorry sorry sorry
注意第一句就出现在 24.25 秒——人声进得晚的歌曲前段本就是空白,这是正常现象,不是歌词缺失。另外 duration 字段可用来对齐音频时长,若数据库时长与实际差很多,大概率是不同版本(电台版与专辑版前奏长度常差十几秒),必须重打时间轴。
三、调用的坑:/api/get 与 /api/get-by-id 的差别
实测三种请求方式的结果并不一样:
/api/get?artist_name=&track_name=&album_name=(三参数精确匹配)→ 404,返回 JSON 错误体(含 message、name、statusCode)。原因是参数必须与库中完全一致,差一个字就没有。/api/search?track_name=→ 200,返回 20 条候选。这是首选做法。/api/get-by-id/7017616→ 404,说明这个路径写法无效。
正确流程是"先 search 拿 id,再从 search 返回体里直接读 syncedLyrics",而不是二次 get。写程序时务必按状态码分支处理:404 要当正常情况(用户就搜不到),不能抛异常中断。
四、同名规则:为什么播放器不显示歌词
绝大多数播放器的匹配逻辑是:MP3 与 LRC 必须同目录、主文件名完全一致,如 song.mp3 对应 song.lrc。不显示时按顺序查:
- 文件名是否有多余空格、后缀是否被伪装(
song.lrc.txt是最常见错法)。 - 编码是否含 BOM 或为 GBK,播放器只认 UTF-8 时会乱码。
- MP3 内嵌的 USLT/SYLT 标签与外部文件冲突,部分播放器优先读内嵌。
要写进 MP3 内部,可用 ffmpeg -i song.mp3 -i song.lrc -map 0 -map 1 -c copy -metadata:s:v:0 remove_cover=1 out.mp3 之类方式挂载,但滚动歌词更推荐用 SYLT 帧,兼容面不如外部 LRC 文件稳。
五、自己打时间轴的最快方法
用支持"击键打点"的编辑器,边播边按快捷键写入当前时间。手动写的规范:标签打在该句人声实际出声的前 0.1 到 0.3 秒,视觉上更贴合;纯器乐段留空行或写 [00:51.34] (Instrumental)。写完用 offset 做整体微调,比逐行修改快得多。
六、常见问题 FAQ
问:LRC 一定要和 MP3 一起分发吗?
答:不是。任何播放器都能独立播放 MP3,歌词只是可选增强项。
问:一秒差很多怎么办?
答:先看是不是版本不同;版本一致却整体偏移,只改 offset 即可。
问:中文歌词出现方块?
答:编码问题,转成无 BOM 的 UTF-8。
七、总结
LRC 的全部要点就是:语法上 [mm:ss.xx] 加文本、元信息用 [ti:][ar:][offset:];获取上优先调 lrclib.net/api/search 并从返回体直读 syncedLyrics,把 404 视为正常;显示上保证同目录同主文件名与 UTF-8 编码;整体偏移只动 offset,不逐行重打。歌词对不齐几乎都是版本差异导致的,先核对 duration 再动手。
生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »
