【问题标题】:Get album artwork from ID3 tag/Convert function from Java to Objective-C从 ID3 标签获取专辑封面/从 Java 到 Objective-C 的转换函数
【发布时间】:2011-07-07 07:44:30
【问题描述】:

我有以下问题要问:

如何使用 iOS 应用程序编译 taglib?

当我将文件夹添加到我的项目中时,我有点困惑,试图编译它,但它却失败了,出现 1640 错误。

我如何使它成功编译 - 我问的原因是 taglib 允许从标签中提取专辑插图。

如果有人知道基于 Objective-C 的专辑插图提取类,它会有所帮助 - 我不知道为什么 Apple 不在 Core Foundation 中添加这样做的方法 - 因为有一些方法可以从ID3 标签。

我不明白为什么没有一些 Objective-C 的方式来做到这一点。

任何帮助表示赞赏。

编辑:

经过数小时的尝试,我发现了一个 Java 函数 here 似乎可以很好地完成这项工作,但我没有关于如何转换的线索它适用于 Objective-C(或者更不用说 C++),因为它的类型似乎与 Objective-C/C++ 中的类型完全不同。

如果有人知道转换它的方法,它真的会有所帮助,因为这似乎是我尝试过很多其他方法后的最后选择。

【问题讨论】:

  • 什么样的错误?您确定它们与标头字段搜索路径或类似问题无关吗?
  • 您是否真的尝试按照我在下面的第二条评论中链接到的讨论进行操作?它清楚地展示了如何仅使用 Apple 的框架来访问 ID3 信息。
  • 是的,我做到了,并成功获取了它的艺术家、专辑和歌曲名称信息。我还能够记录标签的内容,但专辑插图没有常数。因此,我必须以某种方式处理原始 ID3 标签,并以某种方式在其中找到图像。这是我不知道的一点。
  • 根据您上面指向 Java 代码的链接;那里没有列出任何特定于 Java 的内容,对于任何相对有经验的 C 程序员来说转换应该是相当简单的。它所做的只是在字节级别解析 MP3 文件,使用记录的文件格式 here

标签: iphone objective-c ios taglib albumart


【解决方案1】:
- (void)loadArtworksForFileAtPath:(NSString *)path completion:(void (^)(NSArray *))completion
{
    NSURL *u = [NSURL fileURLWithPath:path];
    AVURLAsset *a = [AVURLAsset URLAssetWithURL:u options:nil];
    NSArray *k = [NSArray arrayWithObjects:@"commonMetadata", nil];

    [a loadValuesAsynchronouslyForKeys:k completionHandler: ^{
        NSArray *artworks = [AVMetadataItem metadataItemsFromArray:a.commonMetadata
             withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon];

         NSMutableArray *artworkImages = [NSMutableArray array];
         for (AVMetadataItem *i in artworks)
         {
             NSString *keySpace = i.keySpace;
             UIImage *im = nil;

             if ([keySpace isEqualToString:AVMetadataKeySpaceID3])
             {
                 NSDictionary *d = [i.value copyWithZone:nil];
                 im = [UIImage imageWithData:[d objectForKey:@"data"]];
             }
             else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes])
                 im = [UIImage imageWithData:[i.value copyWithZone:nil]];

             if (im)
                 [artworkImages addObject:im];
         }

         completion(artworkImages);
     }];
}

【讨论】:

  • 非常感谢,稍作修改即可完美运行!
  • 对我不起作用。不知何故,它返回一个元素数为 0 的非空数组。我该怎么办?
  • 也许您可以澄清一下包含 0 个元素的非空数组是什么意思?
  • 我试图编辑答案来修复它(因为这个代码的 sn-p 不起作用)。不幸的是,审阅者拒绝了我的编辑,所以我将其发布在下面作为新答案。
  • 请注意,iOS 8 已更改返回的数据。更新代码见这里:stackoverflow.com/questions/25778757/…
【解决方案2】:

这只是上面@hatfinch 的答案,但已修复并正在工作。

- (void)artworksForFileAtPath:(NSString *)path block:(void(^)(NSArray *artworkImages))block
{
    NSURL *url = [NSURL fileURLWithPath:path];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    NSArray *keys = [NSArray arrayWithObjects:@"commonMetadata", nil];
    [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
         NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata
                                                            withKey:AVMetadataCommonKeyArtwork
                                                           keySpace:AVMetadataKeySpaceCommon];

         NSMutableArray *artworkImages = [NSMutableArray array];
         for (AVMetadataItem *item in artworks) {
             NSString *keySpace = item.keySpace;
             if ([keySpace isEqualToString:AVMetadataKeySpaceID3]) {
                 NSDictionary *d = [item.value copyWithZone:nil];
                 [artworkImages addObject:[UIImage imageWithData:[d objectForKey:@"data"]]];
             } else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
                 [artworkImages addObject:[UIImage imageWithData:[item.value copyWithZone:nil]]];
             }
         }
         if(block) {
             block(artworkImages);
         }
     }];
}

【讨论】:

    【解决方案3】:

    如果您只是想访问已存储在设备上的音乐作品即从 iPod 应用程序,请查看 this article,它演示了如何使用由Apple,特别是 MediaPlayer 框架。

    如果没有,最好提供更多关于您尝试实现的目标的信息,并提供您在尝试编译 TagLib 时遇到的错误示例。

    编辑:

    另一种解决方案是使用嵌入式 webview 并使用 JavaScript 库(例如 this one)来加载、解析和获取专辑插图?

    【讨论】:

    • 我不想从 iPod 库中获取音乐 - 它们是存储在应用程序文档目录中的 MP3 和 M4A 文件。 TagLib 输出的大多数错误都缺少文件(#include) - 我不太确定它们可能在哪里。如果有任何可以直接导入 Xcode 的框架可能会有所帮助 - 因为我只是将文件夹拖到我的项目中。
    • @jack-greenhill 看看this forum discussion 上讨论的内容是否有帮助。它使用 iPhone 的原生框架从自定义 MP3 文件中访问 ID3 数据。除非您有以这种方式处理 3rd 方库的经验(从您的问题和评论中不建议),否则我建议您远离任何未明确声明它支持 iOS 并提供有关如何进行编译;不幸的是,TagLib 两者都没有。
    • @jack-greenhill 就像 micpringle 说的......第 3 方库......如果你真的想这样做,你可以从这里开始并点击链接:stackoverflow.com/questions/6578080/…
    • 我不介意使用 3rd 方库,因为我认为有希望实际上获得任何特定音频文件的专辑封面。我会四处看看,看看是否有使用 Cocoa 的,如果没有,我会进一步调查让 TagLib 为 iOS 编译。
    • 我并不是建议您不要使用第三方库,只是您的帖子和 cmets 显示了一些天真,因为您认为您可以只需拖入代码它会编译。以我的经验,我从来没有找到一个第三方库不需要至少一点手动设置,例如调整构建设置(标题搜索路径,链接器标志等),即使是那些写在对象-C。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多