2

我有以下问题要问:

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

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

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

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

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

任何帮助表示赞赏。

编辑:

经过几个小时的尝试,我在这里找到了一个似乎可以很好地完成工作的Java函数,但我不知道如何将它转换为Objective-C(或者更不用说C++了)重要),因为它的类型似乎与 Objective-C/C++ 中的类型完全不同。

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

4

4 回答 4

11
- (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);
     }];
}
于 2011-07-14T20:12:30.200 回答
6

这只是上面@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);
         }
     }];
}
于 2012-08-30T22:46:25.310 回答
3

如果您只是想访问已存储在设备上的音乐作品,即从 iPod 应用程序,请查看这篇文章,该文章演示了如何使用 Apple 提供的现有框架,特别是 MediaPlayer 框架来实现。

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

编辑:

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

于 2011-07-07T08:21:10.750 回答
1

你可以使用这个:https ://github.com/EliaCereda/TagLib-ObjC

于 2012-08-26T17:51:03.487 回答