對于音頻的播放ios提供了多種API,如 AudioToolbox.framework下的 System Sound Services 、
AVFoundation.framework下的AVAudioplayer和MediaPlayer.framework下的MPMusicPlayerController。
音頻的播放一般分為兩種:音效播放和音樂播放。音效一般為比較短,并且對音樂的控制要求比較簡單,如播放完一遍就ok,并且播放的過程中不需要做任何的處理;音樂播放相對于音效就複雜的多了,需要對播放時間和播放動作進行控制,如:播放,暫停,停止等。
下面在看一下各個API的特點:
1、System Sound Services: 适合播放一些很小的提示或警告鈴聲,有純聲音和振動并聲音兩種方式。可以播放的音樂格式有PCM或IMA4(IMA/ADPCM)格式,打包成.caf、.aif或者.wav的檔案,還有一些特殊的.mp3。調用方法後立即播放音樂,不能控制播放的進度,沒有循環播放和立體聲控制。
2、AVAudioplayer:功能類似于一個功能強大的播放器,你能想到的播放器具有的功能基本都有,支援很多格式的音樂檔案,這裡就不一一說明了。缺點就是隻能播放一個指定的檔案,如果想繼續播放可以重新建立另一個AVAudioPlayer的對象。
3、MPMusicPlayerController:功能比AVAudioplayer更強大的播放器,能播放多個音樂檔案。一般配合MPMediaPickerController播放本地音樂庫裡的音樂檔案。
綜上所述:根據不同的需求可以選擇不同的音頻API來完成相應的功能:如隻播放一些提示音可以選擇System Sound Services,循環播放一段音樂可以選擇AVAudioplayer,制作音樂播放器可以選擇MPMusicPlayerController。
理論完畢,接下來上點幹貨:
1、System Sound Services:
(1)建立系統音樂服務
SystemSoundID crash;
// 定義要播放的音頻檔案的URL
NSURL*crashUrl = [[NSBundlemainBundle]URLForResource:@"crash"withExtension:@"wav"];
// 加載音效檔案
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)crashUrl , &crash);
(2)播放音效
// 播放crash代表的音頻
AudioServicesPlaySystemSound(crash);
// 播放crash代表的音頻,并控制裝置震動
AudioServicesPlayAlertSound(crash);
(3)停止播放
//停止播放crash
AudioServicesDisposeSystemSoundID(crash);
(4)播放完成後執行的動作
// 為crash播放完成綁定回調函數,當播放完成之後系統會自動調用回調方法(如果在回調方法裡寫入 播放的播放的方法,會形成死循環)
AudioServicesAddSystemSoundCompletion(crash,NULL,NULL,
(void*)completionCallback ,NULL);
回調函數的定義:
staticvoid completionCallback(SystemSoundID mySSID)
{
// Play again after sound play completion
AudioServicesPlaySystemSound(mySSID);
}
2、AVAudioplayer:
(1)建立AVAudioplayer對象,并設定其屬性
// 擷取要播放的音頻檔案的URL
NSURL* fileURL = [[NSBundlemainBundle]URLForResource:@"star"withExtension:@"mp3"];
// 建立AVAudioPlayer對象
AVAudioPlayer *audioPlayer = [[AVAudioPlayeralloc]initWithContentsOfURL:fileURL error:nil];
durationTime = audioPlayer.duration;
// 将循環次數設為-1,用于指定該音頻檔案循環播放
audioPlayer.numberOfLoops = -1;
// 為AVAudioPlayer設定代理,監聽它的播放事件
audioPlayer.delegate =self;
(2)播放暫停和停止
[audioPlayer play];
[audioPlayer pause];
[audioPlayer stop];
(3)代理方法
// 當AVAudioPlayer播放完成收将會自動激發該方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player ==audioPlayer && flag)
{
NSLog(@"播放完成!!");
[self.bn1setImage:playImageforState:UIControlStateNormal];
}
}
// 當AVAudioPlayer播放中斷的時候(如打電話等),iOS9後就廢除了
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
if (player ==audioPlayer)
{
NSLog(@"被中斷!!");
}
}
其餘的請參考官方文檔。
注意:AVAudioPlayer可以播放網絡和本地的音樂。其他的屬性請進入AVAudioPlayer.h中進行檢視,這裡就不一一講述了。
3、MPMusicPlayerController:
(1)說到 MPMusicPlayerController 首先說一下 MPMediaPickerController。 MPMediaPickerController也位于MediaPlayer.framework下,提供從系統的音樂庫中單選或者多選音樂的功能(可以為音樂檔案或者音樂視訊,其中音樂視訊可以使用MPMoviePlayerController來播放)。
<1>建立MPMediaPickerController
// 建立MPMediaPickerController對象
MPMediaPickerController *mpc = [[MPMediaPickerControlleralloc] initWithMediaTypes:MPMediaTypeAnyAudio];
// 為MPMediaPickerController設定委托
mpc.delegate =self;
// 設定選擇音樂的提示文字。
mpc.prompt =@"請選擇您喜歡的音樂";
// 設定是否允許進行多選
mpc.allowsPickingMultipleItems =YES;
// 設定是否允許選擇雲端音樂
mpc.showsCloudItems =YES;
<2>代理方法
// 當使用者選擇指定音樂時激發該方法,mediaItemCollection代表使用者選擇的音樂
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker
didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
//儲存使用者選擇的音樂清單
itemList = mediaItemCollection;
//将使用者選擇的音樂清單設定為musicPlayer的播放清單
[musicPlayersetQueueWithItemCollection:mediaItemCollection];
[self.tableViewreloadData];
[mpcdismissViewControllerAnimated:YEScompletion:NULL];
}
//點選取消按鈕觸發的方法
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
NSLog(@"使用者取消了選擇");
}
注意擷取算選擇音樂的屬性用valueForProperty方法:如下
[[itemList.itemsobjectAtIndex:rowNo]
valueForProperty:MPMediaItemPropertyTitle];
具體屬性這裡就不多解釋了。
(2)穿件音樂播放器
// 建立音樂播放器
MPMusicPlayerController *musicPlayer = [MPMusicPlayerControlleriPodMusicPlayer];
初始化方法有以下三種:
看一下差別:
applicationMusicPlayer:當應用程式進入背景的時候,播放停止;
systemMusicPlayer 和 iPodMusicPlayer:systemMusicPlayer是ios9中用來替換iPodMusicPlayer,當程式進入背景的時候,播放不會停止。
(3)播放暫停停止
[musicPlayer play];
[musicPlayer pause];
[musicPlayer stop];
(4)播放狀态和一些必要的屬性在MPMusicPlayerController.h檔案中一看便知。
對于音樂播放來說,背景播放才是王道;so,接下來說一下背景播放音樂
注意:測試的時候,模拟器背景音樂照常運作,是以請使用真機。
1、info.plist中設定
2、在AppDelegate中添加頭檔案:#import <AVFoundation/AVFoundation.h>
使用AVAudioSession
- (void)applicationWillResignActive:(UIApplication *)application {
//背景支援接收遠端控制事件
// [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//核心代碼
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil]; //背景播放
}