GVMusicPlayerController 0.5.0

GVMusicPlayerController 0.5.0

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布日期最后发布2014 年 12 月

Kevin Renskerseightytwo 维护。



  • 作者:
  • Kevin Renskers

MPMusicPlayerController 的简单性与 AVPlayer 的强大功能的结合。

问题

所以,您想在您的应用中播放 iPod 库中的音乐。简单地讲,有两种可能的方法可以这样做

MPMusicPlayerController
使用 MPMusicPlayerController。易于使用,只需给它一个媒体查询或媒体集合即可。它可以轻松地获取关于播放状态和曲目更改的提醒,远程控制事件可以工作,现在播放中心可以自动更新。随机播放和重复模式会按预期工作,并且 iCloud (iTunes Match)中的音乐也可以正常工作。

然而,当应用处于后台时,通知不会工作,您的应用图标也不会出现在多任务栏中。如果您不需要这些功能,MPMusicPlayerController 就能满足您的需求。

AVPlayer
更强的方法是使用 AVPlayer。您可以在后台执行代码,并且您的应用图标将显示在多任务栏中。

然而,它与媒体查询或媒体集合不兼容。它对队列、重复模式和随机播放一无所知。它本身不会发送关于曲目更改的通知。最重要的是,设置起来非常复杂:处理现在播放中心、监听远程控制事件、处理音频路由更改等。

AVAudioPlayer
此类无法处理 iPod 库项目,因此除非您想将音频文件复制到您的应用沙盒中,否则没有其他选择。

解决方案

GVMusicPlayerController 将 MPMusicPlayerController 的简单性和 API 与 AVPlayer 的播放功能结合起来,为您提供后台代理方法以及您的应用程序图标会在多任务栏中。

问题所在

那么问题是什么,您可能想知道?遗憾的是,AVPlayer 无法播放存放在 iCloud 中或包含 DRM 的音乐。这可能是一个主要的决策因素。

示例

处理 MPMediaPickerController 几乎是一样的!

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
    [[GVMusicPlayerController sharedInstance] setQueueWithItemCollection:mediaItemCollection];
    [mediaPicker dismissViewControllerAnimated:YES completion:nil];
}

更好的代理回调,将在应用处于后台时被调用

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[GVMusicPlayerController sharedInstance] addDelegate:self];
}

- (void)viewDidDisappear:(BOOL)animated {
    [[GVMusicPlayerController sharedInstance] removeDelegate:self];
    [super viewDidDisappear:animated];
}

- (void)musicPlayer:(GVMusicPlayerController *)musicPlayer playbackStateChanged:(MPMusicPlaybackState)playbackState previousPlaybackState:(MPMusicPlaybackState)previousPlaybackState {
    self.playPauseButton.selected = (playbackState == MPMusicPlaybackStatePlaying);
}

- (void)musicPlayer:(GVMusicPlayerController *)musicPlayer trackDidChange:(MPMediaItem *)nowPlayingItem previousTrack:(MPMediaItem *)previousTrack {
    // Labels
    self.songLabel.text = [nowPlayingItem valueForProperty:MPMediaItemPropertyTitle];
    self.artistLabel.text = [nowPlayingItem valueForProperty:MPMediaItemPropertyArtist];

    // Artwork
    MPMediaItemArtwork *artwork = [nowPlayingItem valueForProperty:MPMediaItemPropertyArtwork];
    if (artwork != nil) {
        self.imageView.image = [artwork imageWithSize:self.imageView.frame.size];
    }
}

- (void)musicPlayer:(GVMusicPlayerController *)musicPlayer volumeChanged:(float)volume {
    self.volumeSlider.value = volume;
}

示例中包含了一个完整的音乐播放器应用程序。由于使用了故事板,该示例应用程序需要iOS 5才可运行。请注意,示例应用程序中的图像资源并非免费使用,而代码是免费的。

要求

  • iOS 5 或更高版本
  • 您需要将以下框架添加到项目中(或使用 CocoaPods 进行自动依赖关系处理):CoreMediaAudioToolboxAVFoundationMediaPlayer

问题和疑问

遇到 bug?请在 GitHub 上 创建一个问题

许可证

GVMusicPlayerController 代码在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。
示例应用程序中提供的图像资源不属于本许可证范围,不得复制、修改或以任何方式进行使用。