Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

При получении определенного элемента я бы использовал константу общих ключей метаданных, объявленную в 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;