3

iTunesは曲ファイルから歌詞情報を取得します

iTunesは曲ファイルから歌詞情報を取得するのですが、cocoaやcarbonで曲ファイルから歌詞を取得する方法やAPI(ネットワークを使わないでください!)があれば教えていただきたいです。よろしくお願いします。:)

4

2 に答える 2

2

そして、これを行う簡単な方法はありません。

サードパーティのライブラリを使用する必要があります。また、さまざまな形式からのタグの読み取りを透過的に処理するサードパーティライブラリがいくつかありますが、それらはタグの「基本セット」のみをそのように処理します。それ以外の場合は、実際にフォーマットについて知っている必要があります。

たとえば、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();
}

それは私の頭から離れているので、そのまま動作することを期待しないでください。そしてもちろん、エラー処理はほとんどありません。しかし、欠けている大きな点は、処理しているファイルの種類と、そのファイルから取得するタグの種類を把握する方法が示されていないことです。(これは上記の2つの例で非常に簡単ですが、「。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はTagLibよりも単純にMPEG4ファイルを処理します(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:mydesc:'eng'」と呼び、ITMFがそれらを「©lyr」と呼ぶことを私はまだ知っていなければなりませんでしたが、Pythonの動的な性質により、Mutagenは他のすべての詳細を隠すことができます。

于 2012-06-16T01:25:37.313 に答える
0

簡単な方法はありませんか?ScriptingBridge を使用する場合はどうでしょうか。質問には「osx」というタグが付けられているため、iTunes が存在して使用されていると見なすことができます。何らかの理由でこのデータについてiTunesに問い合わせることができない場合、これはもちろん機能しません

sdef /Applications/iTunes.app | sdp -fh --basename iTunesiTunes.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を参照してください。

よろしければ、すべての音楽などを反復処理できます

于 2013-02-04T17:16:21.503 に答える