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播放器的時候實現後臺播放,如下圖所示,音樂播放後臺開啟就行了:
在使用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了。