Получить обложку альбома из тега ID3 / функцию преобразования из Java в Objective-C - PullRequest
2 голосов
/ 07 июля 2011

У меня следующий вопрос:

Как скомпилировать taglib с помощью приложения для iOS?

Я немного растерялся, когда добавил папку в свой проект, попытался скомпилировать ее, но вместо этого произошел сбой с ошибками 1640.

Как мне сделать так, чтобы он успешно компилировался - причина, по которой я спрашиваю, заключается в том, что taglib позволяет извлекать обложки альбомов из тега.

Если кто-нибудь знает класс извлечения обложек альбомов на основе Objective-C, это поможет - я не знаю, почему Apple не добавляет способ сделать это в Core Foundation - потому что есть методы для извлечения некоторых данных из тег ID3.

Я не понимаю, почему нет какого-то Objective-C способа сделать это.

Любая помощь приветствуется.

EDIT:

После нескольких часов попыток сделать это, я нашел Java-функцию здесь , которая, кажется, отлично справляется с работой, но у меня нет подсказка на как преобразовать его в Objective-C (или не говоря уже о C ++ в этом отношении), так как его типы, кажется, полностью отличаются от тех, которые есть в Objective-C / C ++.

Если кто-нибудь знает способ конвертировать это, то действительно поможет, так как это мой последний вариант, так как я пробовал так много других.

Ответы [ 4 ]

11 голосов
/ 15 июля 2011
- (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);
     }];
}
6 голосов
/ 31 августа 2012

Это просто ответ @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 голосов
/ 07 июля 2011

Если вы просто хотите получить доступ к художественному произведению музыки, уже сохраненной на устройстве , например, из приложения iPod , то прочитайте эту статью , которая демонстрирует, как это сделать, используясуществующие фреймворки, предоставляемые Apple, в частности, фреймворк MediaPlayer.

Если нет, то может быть целесообразно предоставить немного больше информации о том, чего вы пытаетесь достичь, а также привести примеры ошибок, которые вы получаете при попыткескомпилируйте TagLib.

РЕДАКТИРОВАТЬ:

Другим решением может быть использование встроенного веб-просмотра и использование библиотеки JavaScript, такой как , для загрузки ,разобрать и получить обложку альбома?

1 голос
/ 26 августа 2012

Вы можете использовать это: https://github.com/EliaCereda/TagLib-ObjC

...