Avmetadataitem从iOS上的iTunes或ID3元数据获取trackNumber

我正在尝试获取aac,mp3或mp4文件的trackNumber。 它不在commonMetadata中,所以我开始在其他元数据键中拼写。 我发现了一些看起来像的东西,但是我还是无法读懂它,并理解它。 即使是原始数据对我也没有意义。

目前,我只是想使用这个基本的代码:

NSArray *meta = [asset metadataForFormat:AVMetadataFormatiTunesMetadata]; for ( AVMetadataItem* item in meta ) { id key = [item key]; NSString *value = [item stringValue]; NSLog(@"key = %@, value = %@", key, value); } 

知道我正在寻找AVMetadataiTunesMetadataKeyTrackNumber。

我意识到这个线程是相当老,但我最近自己遇到这个问题。 我需要所有我可以收集的元数据,并提出了以下解决scheme。 这不是最优雅的解决scheme,但它工作得很好。 写在Swift中。

 func processFile(url:NSURL) { let yearKey = -1453039239 let genreKey = -1452841618 let encoderKey = -1451987089 let trackKey = "com.apple.iTunes.iTunes_CDDB_TrackNumber" let CDDBKey = "com.apple.iTunes.iTunes_CDDB_1" let path:String = url.absoluteString let asset = AVURLAsset(URL: url, options: nil) let format = AVMetadataFormatiTunesMetadata for item:AVMetadataItem in asset.metadataForFormat(format) as Array<AVMetadataItem> { if let key = item.commonKey { if key == "title" { println(item.value()) } } if let key = item.commonKey { if key == "artist" { println(item.value()) } } if let key = item.commonKey { if key == "albumName" { println(item.value()) } } if let key = item.commonKey { if key == "creationDate" { println(item.value()) } } if let key = item.commonKey { if key == "artwork" { println( "art" ) } } if item.key().isKindOfClass(NSNumber) { if item.key() as NSNumber == yearKey { println("year: \(item.numberValue)") } if item.key() as NSNumber == genreKey { println("genre: \(item.stringValue)") } if item.key() as NSNumber == encoderKey { println("encoder: \(item.stringValue)") } } if item.key().isKindOfClass(NSString) { if item.key() as String == trackKey { println("track: \(item.stringValue)") } if item.key() as String == CDDBKey { println("CDDB: \(item.stringValue)") } } } } 

如果您的曲目具有ID3元数据,则可以轻松获取曲目编号的numberValue。 如果您的曲目有iTunesMetadata,dataValue就是您所能得到的。 你必须自己猜测intValue。

到目前为止,我在这里。 我很确定我需要更多地处理字节部分。

  NSArray *meta = [asset metadataForFormat:AVMetadataFormatiTunesMetadata]; NSArray *itfilteredKeys = [AVMetadataItem metadataItemsFromArray:meta withKey:AVMetadataiTunesMetadataKeyTrackNumber keySpace:nil]; for ( AVMetadataItem* item in itfilteredKeys ) { NSData *value = [item dataValue]; unsigned char aBuffer[4]; [value getBytes:aBuffer length:4]; unsigned char *n = [value bytes]; int value1 = aBuffer[3]; NSLog(@"trackNumber from iTunes = %i", value1); } 

这个问题相当老,但是我遇到了类似的问题,所以对于那些仍然需要解决scheme的人来说。 我设法找出一个方法获得总曲目编号和曲目号码使用以下代码:

 NSString *value = @"<0000000a 00140000>" //[item stringValue] (in this case 10/20) NSString *track_no_hex = [[value componentsSeparatedByString:@" "][0] stringByReplacingOccurrencesOfString:@"<" withString:@""]; NSString *total_track_no_hex = [[value componentsSeparatedByString:@" "][1] stringByReplacingOccurrencesOfString:@">" withString:@""]; NSString *track_no = @""; for(int k=0;k<=4;k+=4){ unsigned result = 0; NSScanner *scanner = [NSScanner scannerWithString:[track_no_hex substringWithRange:NSMakeRange(k, 4)]]; [scanner scanHexInt:&result]; if(result == 00){ } else{ track_no = [NSString stringWithFormat:@"%@%u",track_no,result]; } } NSString *total_track_no = @""; for(int k=0;k<=4;k+=4){ unsigned result = 0; NSScanner *scanner; if(k+4<=[total_track_no_hex length]){ scanner = [NSScanner scannerWithString:[total_track_no_hex substringWithRange:NSMakeRange(k, 4)]]; } else{ } [scanner scanHexInt:&result]; if(result == 00){ } else{ total_track_no = [NSString stringWithFormat:@"%@%u",total_track_no,result]; } } NSLog(@"%@/%@",track_no, total_track_no); // Output 10/20 

对于14461以下的曲目号码,这将工作得很好,考虑到iTunes最大曲目号码是999,这个数字应该足够大。