- 简介
在写一个蓝牙的项目里边,需要实现一个功能,按外设的按钮实现音乐的播放暂停等功能,以及后台播放。搜索资料了解到
无论是iPod、iTouch、iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐库中同步到你的iOS设备。在MediaPlayer.frameowork中有一个MPMusicPlayerController用于播放音乐库中的音乐。
关于MPMusicPlayerController有两种播放器:applicationMusicPlayer和systemMusicPlayer,前者在应用退出后音乐播放会自动停止,后者在应用停止后不会退出播放状态。但是通过操作,我发现使用applicationMusicPlayer的时候,退出后台音乐停止,但是如果打开音乐播放的后台,并且开启后台任务,那么在退出后台,音乐停止,可以通过按设备按钮再次操作音乐播放。systemMusicPlayer在退出到后台的情况下,只需要把音乐后台打开,音乐播放就不会终止,但是这个类在8.0之前的系统使用时候,会报错,只能是8.0之后的系统使用。
MPMusicPlayerController加载音乐不同于前面的AVAudioPlayer是通过一个文件路径来加载,而是需要一个播放队列。在MPMusicPlayerController中提供了两个方法来加载播放队列:- (void)setQueueWithQuery:(MPMediaQuery )query和- (void)setQueueWithItemCollection:(MPMediaItemCollection )itemCollection,正是由于它的播放音频来源是一个队列,因此MPMusicPlayerController支持上一曲、下一曲等操作。
以下是实现代码,导入框架
#import <MediaPlayer/MediaPlayer.h>
初始化音乐播放器,在获取本地音乐库的文件的时候,可以获取音乐的名字、时长等。
- (void)music{
NSLog(@"systemVersion==%f",[[UIDevice currentDevice] systemVersion].floatValue);
if ([[UIDevice currentDevice] systemVersion].floatValue >= 8.0) {
self.musicPlayerController = [MPMusicPlayerController systemMusicPlayer];//初始化系统音乐播放器
}else{
self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
}
self.musicPlaybackState = self.musicPlayerController.playbackState;
if (![self isPlayingItem] ) {
[self getMusicListFromMusicLibrary];
}
isPlayMusic = YES;
}
// 判断有没有正在播放的媒体项目
- (BOOL)isPlayingItem {
if ([self.musicPlayerController indexOfNowPlayingItem] == NSNotFound) {
return NO;
} else {
return YES;
}
}
- (MPMediaItemCollection *)getMusicListFromMusicLibrary {
self.query = [MPMediaQuery songsQuery];
// 申明一个Collection便于下面给MusicPlayer赋值
MPMediaItemCollection *mediaItemCollection;
if (self.query.items.count == 0) {
return 0;
} else {
//获取本地音乐库文件
NSMutableArray *musicArray= [NSMutableArray array];
for(MPMediaItem *item in self.query.items) {
[musicArray addObject:item];
NSLog(@"%@",item.title);
}
// 将音乐信息赋值给musicPlayer
mediaItemCollection = [[MPMediaItemCollection alloc] initWithItems:[musicArray copy]];
[self.musicPlayerController setQueueWithItemCollection:mediaItemCollection];
}
return mediaItemCollection;
}
几种音乐播放器的状态:
MPMusicPlaybackStateStopped,
MPMusicPlaybackStatePlaying,
MPMusicPlaybackStatePaused,
MPMusicPlaybackStateInterrupted,
MPMusicPlaybackStateSeekingForward,
MPMusicPlaybackStateSeekingBackward
暂停或者播放音乐的代码实现:
- (void)musicPlay{
[self music];
NSLog(@"%lu",(unsigned long)self.musicPlayerController.indexOfNowPlayingItem);
if (self.musicPlaybackState == MPMusicPlaybackStatePlaying) {
[self.musicPlayerController pause];//暂停
self.musicPlaybackState = MPMusicPlaybackStatePaused;
}else if (self.musicPlaybackState == MPMusicPlaybackStateStopped || self.musicPlaybackState == MPMusicPlaybackStatePaused || self.musicPlaybackState == MPMusicPlaybackStateInterrupted) {
[self.musicPlayerController play]; //播放
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
}
实现上一曲的代码:
- (void)musicBack{
if (self.musicPlaybackState != MPMusicPlaybackStatePlaying) {
[self music];
}
[self.musicPlayerController play];
[self.musicPlayerController skipToPreviousItem];
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
实现下一曲的代码:
- (void)musicNext{
if (self.musicPlaybackState != MPMusicPlaybackStatePlaying) {
[self music];
}
[self.musicPlayerController play];
isPause = NO;
[self.musicPlayerController skipToNextItem];
self.musicPlaybackState = MPMusicPlaybackStatePlaying;
}
在使用systemMusicPlayer播放器的时候实现后台播放,如下图所示,音乐播放后台打开就行了:
在使用applicationMusicPlayer,想要实现后台播放,首先要把蓝牙后台打开,然后在appdelegate里添加后台支持接收远程控制事件,代码如下:
- (void)applicationWillResignActive:(UIApplication *)application {
//后台支持接收远程控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//核心代码
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil]; //后台播放
[session setActive:YES error:nil];
}
使用音乐播放器的时候,打开音乐播放后台,审核的时候可能会被拒,需要录制关于实现此功能的视频发给苹果,就OK了。