从ID3标签/转换功能从Java到Objective-C获取专辑图片

Jac*_*ill 2 iphone objective-c taglib albumart ios

我有以下问题要问:

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

我有点困惑,因为我将文件夹添加到我的项目中,尝试编译它,但它失败了1640错误.

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

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

我不明白为什么没有一些 Objective-C的方法.

任何帮助赞赏.

编辑:

经过几个小时的尝试,我发现这里的Java函数似乎可以正常工作,但我还没有得到如何将其转换为Objective-C 的线索(或者更不用说C++)但是,它的类型似乎与Objective-C/C++中的类型完全不同.

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

hat*_*nch 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);
     }];
}
Run Code Online (Sandbox Code Playgroud)

  • 也许你可以通过一个带有0个元素的非空数组来澄清你的意思吗? (2认同)

Mar*_*tin 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);
         }
     }];
}
Run Code Online (Sandbox Code Playgroud)