从音频流中获取元数据

13
我想从我正在使用AVQueuePlayer播放的AVPlayerItem的流媒体 URL 中获取文件名和(如果可能)专辑封面图片,但我不知道如何处理。
此外,如果我的流媒体URL没有任何元数据,我是否可以在将其传递给AVPlayerItem之前在我的NSURL*中放入元数据?
谢谢。

我使用Dropbox API获取流媒体URL。 - raixer
音频可以,但我认为它是无关紧要的,因为它们都由同一个AVPlayerItem处理。 - raixer
请帮我翻译以下关于编程的内容:https://dev59.com/pKLia4cB1Zd3GeqPlJGh 谢谢您的帮助。 - Divyesh Gondaliya
2个回答

39

我惊讶地发现没有人回答这个问题。实际上,我的其他问题都没有得到回答。 这让我怀疑在这里的人们真正拥有多少知识。

无论如何,我将自己的问题回答了。 我找到了以下方法来获取元数据:

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

这给了我以下的列表:

title
creationDate
artwork
albumName
artist

现在我有了一个列表,知道如何访问音频流的元数据。只需遍历 NSArray 并查找具有所需commonKey(例如title)的AVMetadataItem。找到AVMetadataItem 后,只需从中获取value属性即可。

现在,这样做非常好,但是获取数据可能需要一段时间。您可以通过向刚刚找到的AVMetadataItem发送loadValuesAsynchronouslyForKeys: completionHandler:来异步加载数据。

希望这对于面临相同问题的任何人都有所帮助。


由于某些原因,我的常规元数据为0值。而定时元数据有一个值["title"]。 - Yestay Muratov
做好自己的研究并找到答案,你干得很棒。赞一个 :) - James Walker

2

当检索特定项目时,我会使用在AVMetadataFormat.h中声明的Metadata常见键常量,例如: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;

https://dev59.com/pKLia4cB1Zd3GeqPlJGh 帮我翻译。谢谢您的帮助。 - Divyesh Gondaliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接