iOS 蓝牙实现音乐播放

作者: CMD独白 | 来源:发表于2016-10-28 12:08 被阅读1526次
    • 简介

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

    屏幕快照 2016-10-28 11.58.26 AM.png

    在使用applicationMusicPlayer,想要实现后台播放,首先要把蓝牙后台打开,然后在appdelegate里添加后台支持接收远程控制事件,代码如下:

    - (void)applicationWillResignActive:(UIApplication *)application {
        
        
        //后台支持接收远程控制事件
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        //核心代码
        AVAudioSession *session = [AVAudioSession sharedInstance];
        
        [session setCategory:AVAudioSessionCategoryPlayback error:nil]; //后台播放
        [session setActive:YES error:nil];
    }
    
    

    要想了解更多关于MPMusicPlayerController播放器的属性,可以参考地址:http://www.cnblogs.com/kenshincui/p/4186022.html
    http://blog.csdn.net/zhonggaorong/article/details/51597483
    另外,使用音乐播放器的时候,打开音乐播放后台,审核的时候可能会被拒,需要录制关于实现此功能的视频发给苹果,就OK了。

    相关文章

      网友评论

      • wellcoding: 请问一下,我想用蓝牙APP连接音箱,控制音箱播放手机音乐,这个怎么实现呢

      本文标题:iOS 蓝牙实现音乐播放

      本文链接:https://www.haomeiwen.com/subject/pgxeuttx.html