2012-10-14 37 views
7

Tôi đang làm việc trên trình phát nhạc ios với bộ nhớ trên đám mây.Làm cách nào để trích xuất siêu dữ liệu từ tệp mp3 trong phát triển ios

Tôi cần trích xuất thông tin nhạc như tiêu đề, nghệ sĩ, tác phẩm nghệ thuật.

Tôi có một hành động được gọi là playit phát và tạm dừng tệp mp3. Nó cũng nên cư trú một số UILables và UIImage với metadtaa được liên kết với các tập tin mp3. Vấn đề là tôi không thể lấy siêu dữ liệu được trích xuất từ ​​hơn 25 tệp mp3 khác nhau. Đây là mã của tôi:

Url tệp là chính xác vì trình phát âm thanh có thể tìm và phát, nhưng tôi không biết tại sao avmetadataitem không thể nhận siêu dữ liệu.

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

tích hợp mã này (với sửa đổi đề nghị của Alex trong câu trả lời dưới đây) cùng với mã tôi tìm thấy cho chiết xuất từ ​​m4a để tạo ra một tổng quát hơn chức năng. Bạn có thể tìm thấy câu trả lời cho câu hỏi chứa mã m4a mà tôi đã sử dụng: http://stackoverflow.com/questions/14030746/ios-avfoundation-how-do-i-fetch-artwork-from-an-mp3- file/14046486 # 14046486 - Cám ơn mọi người đã tham gia! –

Trả lời

3

Hãy thử

for (NSString *format in [asset availableMetadataFormats]) 

Thay vì

NSArray *metadata = [assest commonMetadata]; 
for (NSString *format in metadata) { 
Các vấn đề liên quan