2012-10-14 22 views
7

Sto lavorando a un lettore musicale ios con archiviazione cloud.Come estrarre i metadati dal file mp3 nello sviluppo ios

Ho bisogno di estrarre le informazioni musicali come titolo, artista, grafica.

Ho un'azione chiamata playit che riproduce e mette in pausa il file mp3. Dovrebbe anche popolare alcuni UILables e UIImage con il metadtaa associato al file mp3. Il problema è che non sono riuscito a ottenere i metadati estratti da più di 25 file mp3 diversi. Ecco il mio codice:

L'URL del file è corretto perché il lettore audio è in grado di trovarlo e riprodurlo, ma non so perché avmetadataitem non è in grado di ottenere i metadati.

- (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

integrato questo codice (con la modifica suggerita di Alex nella risposta qui sotto) insieme al codice che ho trovato per estrarre da m4a per produrre un più generale funzione. Puoi trovarlo in una risposta alla domanda che contiene il codice m4a che ho usato: http://stackoverflow.com/questions/14030746/ios-avfoundation-how-do-i-fetch-artwork-from-an-mp3- file/14046486 # 14046486 - Grazie a tutti i soggetti coinvolti! –

risposta

3

Prova

for (NSString *format in [asset availableMetadataFormats]) 

Invece di

NSArray *metadata = [assest commonMetadata]; 
for (NSString *format in metadata) { 
Problemi correlati