2012-04-24 82 views
1

我試圖獲取aac,mp3或mp4文件的trackNumber。它不在commonMetadata中,所以我開始拼出其他元數據鍵。我發現了一些看起來像的東西,但我還是無法閱讀它,並理解它。即使原始數據對我來說也沒有意義。Avmetadataitem從iOS上的iTunes或ID3元數據獲取trackNumber

目前,我只是想用這個基本的代碼來得到它:

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

我很抱歉,但我不明白你的問題。請在代碼中告訴我們你在做什麼。 – sosborn 2012-04-24 06:44:40

回答

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); 
    } 
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

1

我意識到這個線程相當老,但我最近自己遇到了這個問題。我需要所有我可以收集的元數據,並提出以下解決方案。這不是最優雅的解決方案,但它工作得很好。寫在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)") } 
     } 
    } 
}