如何从歌曲文件中获取歌曲的歌词

时间:2012-06-15 12:54:46

标签: macos cocoa itunes

iTunes get the lyrics information from a song file

iTunes从歌曲文件中获取歌词信息,我想询问是否有一些方法或API可以从歌曲文件(不使用网络!),可可或碳中获取歌词。非常感谢你。 :)

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点。

您需要使用第三方库。而且,虽然有一些第三方库透明地处理来自各种不同格式的阅读标签,但它们只处理标签的“基本集”;除此之外,你必须真正了解这些格式。

例如,使用TagLib,要获得艺术家,您只需执行以下操作:

TagLib::FileRef f1("myfile.mp3");
cout << f1.tag()->artist();
TagLib::FileRef f2("myotherfile.aac");
cout << f2.tag()->artist();

但是对于歌词,它是这样的:

TagLib::MPEG::File f1("myfile.mp3");
TagLib::ID3v2::FrameList frames = f1.ID3v2Tag()->frameListMap()["USLT"];
if (!frames.isEmpty()) {
  TagLib::ID3v2::UnsynchronizedLyricsFrame *frame = 
    dynamic_cast<TagLib::ID3v2::UnsynchronizedLyricsFrame *>(frames.front());
  // There could be multiple frames here; you may want to look at language
  // and/or description, instead of just picking the first.
  if (frame) cout << frames->text;
}
TagLib::MP4::File f2("myotherfile.aac");
TagLib::MP4::Item item = f2.tag()->itemListMap()["\xa9lyr"];
TagLib::StringList strings = item.toStringList();
if (!strings.isEmpty()) {
  // As above, there could be multiple strings.
  cout << strings->front();
}

这是我的头脑,所以不要指望它完全按原样工作。当然,几乎没有错误处理。但是缺少的重要一点是它没有告诉你如何弄清楚你正在处理什么类型的文件,以及你将从中获得什么类型的标记。 (通过上面的两个例子,这很容易,但是名为“.flac”的文件可以是OGG FLAC或原始FLAC,并且可以有VORBISCOMMENT,MetaFLAC,ID3或APE标签。)TagLib有帮助那里的东西同样,但它仍然不是微不足道的。

幸运的是,如果你只关心获得与iTunes 10.6.3完全相同的歌词,那就不那么难了;规则似乎是这样的:

  • 如果扩展名是MP2或MP3(不区分大小写),并且它是带有ID3v2.3或ID3v2.4元数据的MPEG音频文件,则第一个USLT标记的内容(无论描述或语言是什么)是歌词。
  • 如果扩展名匹配.m4?,。aac,.mp4或其他几个,并且它是带有IMTF元数据的音频轨道的MPEG-4文件,则第一个字符串的内容位于第一个©lyr块中是歌词。
  • 在任何其他情况下,都没有歌词。

而且,由于您只处理ID3v2和ITMF,实际上可能更容易为每个使用单独的库 - 例如,libmp4v2处理MPEG4文件比TagLib更简单(因为它不处理任何 MPEG4文件),如下所示:

MP4FileHandle f = MP4Open("myotherfile.aac");
const MP4Tags *tags = MP4TagsAlloc();
MP4TagsFetch(tags, f);
cout << tags->lyrics;
MP4TagsFree(tags);
MP4Close(f);

此外,如果不必使用本机代码(Cocoa或Carbon),则在其他语言中有一些更简单的库。例如,在Python中,使用Mutagen,您可以执行此操作:

def printlyrics(path):
  f = mutagen.File(path)
  for key in f.keys():
    if key.startswith('USLT') or key == u'\xa9lyr':
      print f[key]
      return
printlyrics("myfile.mp3")
printlyrics("myotherfile.aac")

当然我仍然需要知道ID3v2称歌词“USLT:我的desc:'eng'”,而ITMF称它们为“©lyr”,但由于Python的动态特性,Mutagen可以隐藏所有其他细节

答案 1 :(得分:0)

没有简单的方法? 那么使用ScriptingBridge呢?问题被标记为'osx',因此可以假定iTunes出现并使用。如果由于某种原因你不能向iTunes询问这些数据,那么这当然不会起作用

sdef /Applications/iTunes.app | sdp -fh --basename iTunes获取iTunes.h

目前的iTunes歌曲。

iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesTrack * currentTrack=[iTunes currentTrack];
NSString * lyrics=[currentTrack lyrics];

请参阅有关常规ScriptingBridge指南的https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/UsingScriptingBridge/UsingScriptingBridge.html#//apple_ref/doc/uid/TP40006104-CH4-SW15

你可以迭代所有音乐,等等,如果你没问题