我正在为一个能播放各种音轨的客户创建一个iOS移动应用程序。
我想要实现的功能之一是在锁定屏幕和横幅上显示有关当前正在播放的音轨的信息。这是移动用户的简单方便之一,如果您的应用具有播放背景音频,则必须具备此功能。就个人而言,我一直都在使用这个功能!
答案 0 :(得分:1)
您应首先观察AVPlayerItem
的{{1}},如此:
AVAudioPlayer
然后创建一些全局变量:
[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];
您可能需要一个类似下面的功能,因此您可以观察关键路径NSString *title;
NSString *artist;
UIImage *artwork;
并通过timedMetadata
更新信息中心。
updateInfoCenterWithTitle:andArtist:andCover:
这就是魔术发生的地方:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"timedMetadata"])
{
for (int i = 0; i < [audioPlayer.currentItem.timedMetadata count]; i++)
{
AVMetadataItem *metaData = [audioPlayer.currentItem.timedMetadata objectAtIndex:i];
if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyArtist]) {
artist = (NSString *)metaData.value;
}
else if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyTitle])
{
title = (NSString *)metaData.value;
[self updateInfoCenterWithTitle:title andArtist:artist andCover:artwork];
}
else if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyArtwork])
{
if ([metaData.keySpace isEqualToString:AVMetadataKeySpaceID3])
{
NSDictionary *dictionary = [metaData.value copyWithZone:nil];
artwork = [UIImage imageWithData:[dictionary objectForKey:@"data"]]];
} else if ([metaData.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
artwork = [UIImage imageWithData:[metaData.value copyWithZone:nil]];
}
}
else {
NSLog(@"%@ --> %@", [metaData commonKey], metaData.value);
}
}
}
}