gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:21:33 26 4
gpt4 key购买 nike

iTunes get the lyrics information from a song file

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

最佳答案

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

您将需要使用第三方库。而且,虽然有一些第三方库可以透明地处理读取各种不同格式的标签,但它们仅以这种方式处理“基本”标签集;对于其他任何事情,您必须真正了解格式。

例如,使用 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 或其他一些匹配,并且它是一个 MPEG-4 文件,其音轨包含 IMTF 元数据,则第一个 ©lyr block 中第一个字符串的内容是歌词。
  • 在任何其他情况下,都没有歌词。

而且,由于您只处理 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);

此外,如果不必使用 native 代码(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:my desc:'eng'”,而 ITMF 将其称为“©lyr”,但由于 Python 的动态特性,Mutagen 可以隐藏所有其他细节.

关于macos - 如何从歌曲文件中获取歌曲的歌词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com