从音频流中获取元数据

时间:2011-10-10 00:24:01

标签: ios ios4 metadata audio-streaming avqueueplayer

我想获取文件名,如果可能的话,从AVPlayerItem中的流媒体网址获取专辑图片,我正在玩AVQueuePlayer,但我不知道如何去做。

另外,如果我的流媒体网址没有任何元数据,我可以将元数据放入NSURL*,然后再传递给AVPlayerItem吗?

感谢。

2 个答案:

答案 0 :(得分:37)

我很惊讶没有人回答这个问题。 事实上,没有人回答我的任何其他问题。 让我想知道这里的人们真正拥有多少知识。

无论如何,我会继续回答我自己的问题。 我通过执行以下操作找到了如何获取元数据:

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的{​​{1}}(例如commonKey)。然后,当我发现title只是从中获取AVMetadataItem属性时。

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

希望对可能发现自己遇到同样问题的人有所帮助。

答案 1 :(得分: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;