Получение метаданных из аудиопотока

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

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

спасибо.

2 ответов


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

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

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 вы только что нашли.

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


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

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;