Pobieranie metadanych ze strumienia audio

Chciałbym uzyskać nazwę pliku i, jeśli to możliwe, obraz albumu z strumieniowego adresu URL w AVPlayerItem, który gram z AVQueuePlayer, ale nie wiem, jak to zrobić.

Również jeśli okaże się, że mój streaming URL nie ma żadnych metadanych, Czy Mogę umieścić metadane w moim NSURL* przed przekazaniem go do AVPlayerItem?

Dzięki.
Author: raixer, 2011-10-10

2 answers

Dziwi mnie, że nikt nie odpowiedział na to pytanie. W rzeczywistości nikt nie odpowiedział na żadne z moich innych pytań. Zastanawiam się, ile wiedzy ludzie tutaj naprawdę mają.

W każdym razie, odpowiem na własne pytanie. Dowiedz się, jak uzyskać metadane, wykonując następujące czynności:
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
NSArray *metadataList = [playerItem.asset commonMetadata];
for (AVMetadataItem *metaItem in metadataList) {
    NSLog(@"%@",[metaItem commonKey]);
}

Co daje mi listę w następujący sposób:

title
creationDate
artwork
albumName
artist

Z tej listy Teraz wiem, jak uzyskać dostęp do metadanych z Mojego strumienia audio. Wystarczy przejrzeć NSArray i spojrzeć dla AVMetadataItem, który ma commonKey, które chcę (na przykład, title). Kiedy znajdę AVMetadataItem, po prostu zdobędę z niego value własność.

Teraz, to działa świetnie, ale może być możliwe, że gdy spróbujesz uzyskać dane, zajmie to chwilę. Możesz załadować dane asynchronicznie, wysyłając loadValuesAsynchronouslyForKeys:completionHandler: do AVMetadataItem, który właśnie znalazłeś.

Nadzieję, że to pomoże każdemu, kto może znaleźć się z tym samym problemem.

 37
Author: raixer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 05:05:40

Podczas pobierania konkretnej pozycji używałbym stałej metadata common keys zadeklarowanej w AVMetadataFormat.h, czyli: 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;
 2
Author: Korey Hinton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-09 16:11:26