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>創建MPMediaPickerController
// 創建MPMediaPickerController對象
MPMediaPickerController *mpc = [[MPMediaPickerControlleralloc] initWithMediaTypes:MPMediaTypeAnyAudio];
// 爲MPMediaPickerController設置委託
mpc.delegate =self;
// 設置選擇音樂的提示文字。
mpc.prompt =@"請選擇您喜歡的音樂";
// 設置是否允許進行多選
mpc.allowsPickingMultipleItems =YES;
// 設置是否允許選擇雲端音樂
mpc.showsCloudItems =YES;
// 當用戶選擇指定音樂時激發該方法,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]; //後臺播放
}