13

我想从我正在使用 AVQueuePlayer 播放的 AVPlayerItem 中的流 URL 中获取文件名和专辑图像,但我不知道该怎么做。

此外,如果事实证明我的流式 URL 没有任何元数据,我可以在将元数据NSURL*传递给 AVPlayerItem 之前将元数据放入其中吗?

谢谢。

4

2 回答 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并查找AVMetadataItem具有commonKey我想要的(例如,title)。然后,当我找到从它AVMetadataItem那里得到value财产的时候。

现在,这很好用,但是当您尝试获取数据时可能需要一段时间。loadValuesAsynchronouslyForKeys:completionHandler:您可以通过发送到AVMetadataItem您刚刚找到的数据来异步加载数据。

希望对任何可能遇到同样问题的人有所帮助。

于 2011-10-20T05:05:40.257 回答
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;
于 2014-04-09T15:14:53.730 回答