2012-10-14 23 views
7

Bulut depolama ile bir ios müzik çaları üzerinde çalışıyorum.ios geliştirmede mp3 dosyasından meta verileri nasıl alabilirim

Başlık, sanatçı, resim gibi müzik bilgilerini almam gerekiyor.

Mp3 dosyasını çalan ve duraklatan playit adlı bir eylemim var. Ayrıca, bazı UILables ve UIImage'ı mp3 dosyasıyla ilişkilendirilmiş metadtaa ile doldurmalıdır. Sorun, farklı 25 mp3 dosyasından daha fazla çıkarılmış meta verileri alamadım. İşte benim kodum:

Ses dosyası müzikçaları bulabildiği ve çalabildiği için dosya URL'si doğrudur, ancak avmetadataitem'in meta verileri neden alamadığını bilmiyorum.

- (IBAction)playIt:(id)sender { 
AVAudioPlayer *audioPlayer; 
AVAsset *assest; 

NSString * applicationPath = [[NSBundle mainBundle] resourcePath]; 
NSString *secondParentPath = [applicationPath stringByDeletingLastPathComponent]; 
NSString *soundFilePath = [[secondParentPath stringByAppendingPathComponent:@"fisal1407"] stringByAppendingPathComponent:[musicFiles objectForKey:@"show_id"] ]; 

NSURL *fileURL = [NSURL URLWithString:[soundFilePath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 

assest = [AVURLAsset URLAssetWithURL:fileURL options:nil]; 
NSArray *metadata = [assest commonMetadata]; 
for (NSString *format in metadata) { 
    for (AVMetadataItem *item in [assest metadataForFormat:format]) { 
     if ([[item commonKey] isEqualToString:@"title"]) { 
      filename.text = (NSString *)[item value]; 
      NSLog(@" title : %@", (NSString *)[item value]); 
     } 
     if ([[item commonKey] isEqualToString:@"artist"]) { 
      show_id.text = (NSString *)[item value]; 
     } 
     if ([[item commonKey] isEqualToString:@"albumName"]) { 
      // _albumName = (NSString *)[item value]; 
     } 
     if ([[item commonKey] isEqualToString:@"artwork"]) { 
      NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"]; 
      UIImage *img = [UIImage imageWithData:data] ; 
      imageView.image = img; 
      continue; 
     } 
    } 
} 

    if (audioPlayer == nil) { 

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; 
    audioPlayer.numberOfLoops = -1; 

    [audioPlayer play]; 
    [sender setImage:[UIImage imageNamed:@"player_044.gif"] forState:UIControlStateNormal]; 
    } 
else 
    { 
    if (audioPlayer.isPlaying) 
    { 
     [sender setImage:[UIImage imageNamed:@"player_04.gif"] forState:UIControlStateNormal]; 
     [audioPlayer pause]; 
    } else { 
     [sender setImage:[UIImage imageNamed:@"player_044.gif"] forState:UIControlStateNormal]; 
     [audioPlayer play]; 
    } 
} 
} 
+0

Entegre (aşağıda cevap Alex'in önerilen değişiklik ile birlikte) bu kod deneyin işlevi. Kullandığım m4a kodunu içeren soruyu yanıt olarak bulabilirsiniz: http://stackoverflow.com/questions/14030746/ios-avfoundation-how-do-i-fetch-artwork-from-an-mp3- file/14046486 # 14046486 - Katılan herkese teşekkürler! –

cevap

3

daha genel üretmek için birlikte koduyla ben m4a gelen ayıklanması için bulunan

for (NSString *format in [asset availableMetadataFormats]) 

yerine

NSArray *metadata = [assest commonMetadata]; 
for (NSString *format in metadata) { 
İlgili konular