我正在尝试获取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。
答案 0 :(得分:1)
我意识到这个帖子很老了,但我最近自己遇到过这个问题。我需要所有可以收集的元数据并提出以下解决方案。它不是最优雅的解决方案,但它运作良好。写在斯威夫特。
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)") }
}
}
}
答案 1 :(得分:0)
如果您的曲目具有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);
}
答案 2 :(得分:0)
这个问题相当陈旧,但我遇到了类似的问题,所以对于那些仍然需要解决方案的人来说。我设法找到了一种使用以下代码获取总曲目编号和曲目编号的方法:
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,该编号应足够大。