测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可 | MIT |
发布日期最后发布 | 2014 年 12 月 |
由 Kevin Renskers,eightytwo 维护。
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才可运行。请注意,示例应用程序中的图像资源并非免费使用,而代码是免费的。
CoreMedia
、AudioToolbox
、AVFoundation
和 MediaPlayer
遇到 bug?请在 GitHub 上 创建一个问题!
GVMusicPlayerController 代码在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。
示例应用程序中提供的图像资源不属于本许可证范围,不得复制、修改或以任何方式进行使用。