首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MPNowPlayingInfoCenter实现AvAudioPlayer

如何使用MPNowPlayingInfoCenter实现AvAudioPlayer
EN

Stack Overflow用户
提问于 2016-10-26 09:37:26
回答 1查看 1.2K关注 0票数 0

我正在为客户端创建一个iOS移动应用程序,该应用程序将播放各种音频。

我想要实现的功能之一是在锁定屏幕和横幅上显示有关当前播放的音频轨道的信息。这是一个简单的方便移动用户和一个必须拥有,如果你的应用程序有背景音频播放。就我个人而言,我一直在使用这个特性!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 15:00:54

您应该首先观察AVPlayerItem of AVAudioPlayer,如下所示:

代码语言:javascript
复制
[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];

然后创建一些全局变量:

代码语言:javascript
复制
NSString *title;
NSString *artist;
UIImage *artwork;

然后,您可能需要一个如下所示的函数,因此您可以观察关键路径timedMetadata,并通过updateInfoCenterWithTitle:andArtist:andCover:更新InfoCenter。

代码语言:javascript
复制
- (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);
            }
        }
    }
}

这就是魔法发生的地方:

代码语言:javascript
复制
- (void)updateInfoCenterWithTitle:(NSString *)title andArtist:(NSString *)artist andCover:(UIImage *)cover
{
    if (cover == nil) {
        cover = [UIImage imageNamed:@"defaultCover"];
    }

    MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
    [infoCenter setNowPlayingInfo:@{MPMediaItemPropertyTitle:title,
                                    MPMediaItemPropertyArtist:artist,
                                    MPMediaItemPropertyArtwork:[[MPMediaItemArtwork alloc] initWithImage:cover]}];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40258701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档