1. 程式人生 > >iOS 藍芽實現音樂播放

iOS 藍芽實現音樂播放


  • 簡介

在寫一個藍芽的專案裡邊,需要實現一個功能,按外設的按鈕實現音樂的播放暫停等功能,以及後臺播放。搜尋資料瞭解到
無論是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
另外,使用音樂播放器的時候,開啟音樂播放後臺,稽核的時候可能會被拒,需要錄製關於實現此功能的視訊發給蘋果,就OK了。