2013-05-01 3 views
3

Я пытаюсь извлечь информацию из метаданных из .mp3-файла для iPhone-приложения. Я пробовал использовать AVAsset как this. Он не работал, общие метаданные пустые. Но смелость и другое приложение iOS из магазина приложений могут получить данные метаданных. Я не знаю почему?Извлечение обложки MP3-альбома в iOS

Итак, я попытался извлечь то же самое с помощью кода ниже AudioToolBox рамки

CFDictionaryRef piDict = nil; 
    UInt32 piDataSize = sizeof(piDict); 

    // Populates a CFDictionary with the ID3 tag properties 
    err = AudioFileGetProperty(fileID, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict); 
    if(err != noErr) { 
     NSLog(@"AudioFileGetProperty failed for property info dictionary"); 
     return nil; 
    } 

    // Toll free bridge the CFDictionary so that we can interact with it via objc 
    NSMutableDictionary* nsDict = [(__bridge NSDictionary*)piDict mutableCopy]; 

Возвращаемого все, кроме обложки альбома. Когда я попытался извлечь обложку альбома, используя kAudioFilePropertyAlbumArtwork, я получил ошибку osstatus (операция не может быть выполнена).

Итак, наконец, я попробовал свою удачу с ObjC оберткой для libId3 (найдено here). Он работал отлично. Я мог бы получить обложку.

Мой вопрос в том, почему AVAsset не смог получить данные ?. Что мне там не хватает? кому-то удалось заставить его работать ?. Образец будет оценен.

Почему kAudioFilePropertyAlbumArtwork не удалось заполнить ?. Обе проблемы произошли со всеми файлами .mp3, которые у меня были.

Решение Обновление:

AVAsset не работает для меня, потому что я сделал свой URL, используя

[NSURL URLWithString:[filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] 

вместо

NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 

ответ

7

Чтобы использовать AVAsset для извлечения информации метаданных, this post полезен. Следующий код является то, что вам нужно:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"mp3"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; 

NSArray *keys = [NSArray arrayWithObjects:@"commonMetadata", nil]; 
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
    NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata 
                 withKey:AVMetadataCommonKeyArtwork 
                 keySpace:AVMetadataKeySpaceCommon]; 

    for (AVMetadataItem *item in artworks) { 
     if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) { 
      NSDictionary *dict = [item.value copyWithZone:nil]; 
      self.imageView.image = [UIImage imageWithData:[dict objectForKey:@"data"]]; 
     } else if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { 
      self.imageView.image = [UIImage imageWithData:[item.value copyWithZone:nil]]; 
     } 
    } 
}]; 
+0

Я проверил почту уже. Моя проблема - «commonMetadata» возвращает пустой массив. Я имею в виду никаких «ключей». Но информация есть, и я мог бы извлечь то же самое с помощью audiotoolbox. Это происходит со всем mp3-файлом, который у меня есть. – Vignesh

+0

Я использовал этот код, и он отлично извлекает альбомArt. Можете ли вы связать mp3-файл, который вы использовали, или, может быть, ваш код? –

+0

Я могу связать mp3-файл, который я использовал. Я попробовал тот же код, который вы вставили выше. Ссылка (http://starmusiq.com/Composer.asp?Composer=A.R.Rahman&RecNextPg=4) имеет несколько mp3-файлов, вы можете попробовать что угодно. – Vignesh

1
NSURL *fileURL1 = [NSURL fileURLWithPath:url]; 
AVAsset *asset = [AVAsset assetWithURL:fileURL1]; 


for (AVMetadataItem *metadataItem in asset.commonMetadata) { 
    if ([metadataItem.commonKey isEqualToString:@"artwork"]){ 
     NSDictionary *imageDataDictionary = (NSDictionary *)metadataItem.value; 
     NSData *imageData = [imageDataDictionary objectForKey:@"data"]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     imageThumb.image = image; 
    } 
} 
Смежные вопросы