• 简介

在写一个蓝牙的项目里边,需要实现一个功能,按外设的按钮实现音乐的播放暂停等功能,以及后台播放。搜索资料了解到
无论是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了。