2012-04-24 2 views
1

Я пытаюсь получить trackNumber файла aac, mp3 или mp4. Это не в commonMetadata, поэтому я начал использовать другие ключи метаданных. Я нашел что-то похожее, но я все еще не могу его прочитать и понять. Даже исходные данные не имеют для меня никакого смысла.Avmetadataitem Получение номера трека из метаданных iTunes или ID3 на iOS

На данный момент, я просто пытаюсь получить его, используя этот базовый код:

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

ответ

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