为mp3音频添加歌词还挺奇葩
为navidrome上传mp3之后,发现有些音频是有歌词的,有些没有,有点奇怪,就去看了一下github上navidrome上是怎么获取歌词的。
最简单的方式,当然是从api开始,追查的过程略去不讲,只说结果:
- navidrome会通过监控文件目录的变动以及手动触发的方式,去遍历目录下所有音频文件;
- 找到音频文件后通过ffmpeg或者taglib来获取音频文件的元数据,扫描后的信息会存储到数据库中;
- api会查询数据库来响应请求;
我尝试过几款设置歌词的工具,mp3tag是一款GUI软件,是可以成功设置的。xhongc/music_tag_web 可以通过 docker 来运行,也是可以的。ffmpge我尝试过几次没有成功。后来找了一个golang的代码 n10v/id3v2 去设置,这个貌似也行。也是通过这个代码,之前的失败了解的更多,在此进行记录。
元数据是通过一个叫做ID3的结构进行设置的,各个版本之间有一些细节差异,常用的就是ID3V2。不管用哪个版本,基本的结构是不变的,最重要的是叫做标签帧,一个音频数据可以有多个标签帧,每个标签帧最重要的包含了标签ID和标签内容。标签ID和显示出来的名字之间有一个映射关系,这个可以去ID3的官网https://id3.org/id3v2.3.0#Declared_ID3v2_frames去看。
ffmpeg设置元数据的时候,是通过标签名字设置。navidrome默认是通过taglib读取歌词,读取的区域是标签ID为USLT或者SYLT的标签帧,设置的区域如果不对,就读取不出来。其实这种情况应该是可以通过设置navidrome的解码器来改掉的,但这不是本次讨论的点。
我这里涉及到的是USLT,ffmpeg读取出来的标签名字是lyrics,可以有多个KV,每个k的前缀都是lyrics-,后缀是语言的3个字符的简写,可以出现的简写字符也可以在 https://www.loc.gov/standards/iso639-2/php/code_list.php 。
后续:我继续在mac上尝试了id3v2的命令行,这个也可以,但暂时我没找到怎么设置语言。所以目前来看,想在命令行使用,最好的办法还是 n10v/id3v2;