从音频流获取元数据

发布于 2024-12-08 23:38:54 字数 185 浏览 0 评论 0原文

我想从我正在使用 AVQueuePlayer 播放的 AVPlayerItem 中的流 URL 获取文件名以及专辑图像(如果可能),但我不知道如何执行此操作。

另外,如果我的流媒体 URL 没有任何元数据,我可以在将元数据传递给 AVPlayerItem 之前将其放入 NSURL* 中吗?

谢谢。

I would like to get the file name and, if possible, album image from a streaming URL in a AVPlayerItem that I am playing with AVQueuePlayer but I don't know how to go about doing this.

Also if it turns out that my streaming URL doesn't have any metadata can I put metadata in my NSURL* before passing it to the AVPlayerItem?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可可 2024-12-15 23:38:54

好吧,我很惊讶没有人回答这个问题。
事实上,没有人回答我的任何其他问题。
让我想知道这里的人到底有多少知识。

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

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

这给了我一个如下列表:

title
creationDate
artwork
albumName
artist

现在有了该列表,我知道如何从音频流访问元数据。只需简单地浏览 NSArray 并查找具有我想要的 commonKeyAVMetadataItem (例如,title >)。然后,当我找到 AVMetadataItem 时,只需从中获取 value 属性。

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

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

Well I am surprised no one has answered this question.
In fact no one has answered any of my other questions.
Makes me wonder how much knowledge people in here truly have.

Anyways, I will go ahead and answer my own question.
I found out how to get the metadata by doing the following:

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

Which gives me a list as follows:

title
creationDate
artwork
albumName
artist

With that list now I know how to access the metadata from my audio stream. Just simply go through the NSArray and look for an AVMetadataItem that has the commonKey that I want (for example, title). Then when I find the AVMetadataItem just get the value property from it.

Now, this works great but it may be possible that when you try to get the data it will take a while. You can load the data asynchronously by sending loadValuesAsynchronouslyForKeys:completionHandler: to the AVMetadataItem you just found.

Hope that helps to anyone who may find themselves with the same problem.

我喜欢麦丽素 2024-12-15 23:38:54

当检索特定项目时,我将使用 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;

When retrieving a particular item I would use the Metadata common keys constant declared in AVMetadataFormat.h, i.e.: 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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文