Получение метаданных из аудиопотока - PullRequest
11 голосов
/ 10 октября 2011

Я хотел бы получить имя файла и, если возможно, изображение альбома из потокового URL в AVPlayerItem, который я играю с AVQueuePlayer, но я не знаю, как это сделать.

Также, если выяснится, что у моего потокового URL нет метаданных, могу ли я добавить метаданные в свой NSURL* перед передачей его в AVPlayerItem?

Спасибо.

Ответы [ 2 ]

37 голосов
/ 20 октября 2011

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

В любом случае, я пойду и отвечу на свой вопрос. Я узнал, как получить метаданные, выполнив следующее:

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
NSArray *metadataList = [playerItem.asset commonMetadata];
for (AVMetadataItem *metaItem in metadataList) {
    NSLog(@"%@",[metaItem commonKey]);
}

Что дает мне список следующим образом:

title
creationDate
artwork
albumName
artist

С этим списком теперь я знаю, как получить доступ к метаданным из моего аудиопотока. Просто пройдите через NSArray и найдите AVMetadataItem, у которого есть commonKey, который я хочу (например, title). Затем, когда я найду AVMetadataItem, просто получу из него свойство value.

Теперь, это прекрасно работает, но возможно, что когда вы попытаетесь получить данные, это займет некоторое время. Вы можете загрузить данные асинхронно, отправив loadValuesAsynchronouslyForKeys:completionHandler: на AVMetadataItem, который вы только что нашли.

Надеюсь, это поможет любому, кто может столкнуться с той же проблемой.

2 голосов
/ 09 апреля 2014

При извлечении определенного элемента я бы использовал константу общих ключей метаданных, объявленную в AVMetadataFormat.h, т.е.

NSUInteger titleIndex = [avItem.asset.commonMetadata indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    AVMutableMetadataItem *metaItem = (AVMutableMetadataItem *)obj;
    if ([metaItem.commonKey isEqualToString:AVMetadataCommonKeyTitle]) {
        return YES;
    }
    return NO;
}];

AVMutableMetadataItem *item = [avItem.asset.commonMetadata objectAtIndex:titleIndex];
NSString *title = (NSString *)item.value;
...