Вполне возможно получить информацию ID3, встроенную в файл MP3 (имя исполнителя, название дорожки), не загружая весь файл или используя низкоуровневые API. Функциональность является частью AVFoundation
framework.
Класс для просмотра AVAsset
и, в частности, это подкласс для сети AVURLAsset
. AVAsset
имеет свойство NSArray
с именем commonMetadata
. Это свойство commonMetadata
будет содержать экземпляры AVMetadataItem
, если, конечно, ссылочный URL содержит метаданные. Обычно вы будете использовать AVMetadataItem
's commonKey
свойство для ссылки на элемент. Я нахожу этот метод итерации по проверке массива commonKeys
раздражающим, поэтому я создаю NSDictionary
, используя свойство commonKey
в качестве key
и свойство value
в качестве object
. Вот так:
-(NSDictionary *)dictionaryOfMetadataFromAsset:(AVAsset *)asset{
NSMutableDictionary *metaData = [[NSMutableDictionary alloc] init];
for (AVMetadataItem *item in asset.commonMetadata) {
if (item.value && item.commonKey){
[metaData setObject:item.value forKey:item.commonKey];
}
}
return [metaData copy];
}
С добавлением этого простого метода метаданные AVAsset
становятся довольно простыми в использовании. Вот пример получения метаданных MP3 через URL:
NSURL *mp3URL = [NSURL URLWithString:@"http://'AddressOfMP3File'"];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:mp3URL options:nil];
NSDictionary *metaDict = [self dictionaryOfMetadataFromAsset:asset];
NSLog(@"Available Metadata :%@",metaDict.allKeys);
NSLog(@"title:%@",[metaDict objectForKey:@"title"]);
Я обнаружил, что этот код загружает только первые несколько секунд вашего файла MP3. Также обратите внимание, что этот код является синхронным; Так что используйте с осторожностью. Но AVURLAsset
имеет некоторые асинхронные функции, описанные в документации.
Когда у вас есть AVAsset
, вы можете создать с ним AVPlayerItem
и передать его AVPlayer
и играть на нем или нет.