天天看點

音頻播放(System Sound Services、MPMusicPlayerController、AVAudioplayer) for IOS

對于音頻的播放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];

初始化方法有以下三種:

音頻播放(System Sound Services、MPMusicPlayerController、AVAudioplayer) for IOS

看一下差別:

applicationMusicPlayer:當應用程式進入背景的時候,播放停止;

systemMusicPlayer 和 iPodMusicPlayer:systemMusicPlayer是ios9中用來替換iPodMusicPlayer,當程式進入背景的時候,播放不會停止。

(3)播放暫停停止

[musicPlayer play];

[musicPlayer pause];

[musicPlayer stop];

(4)播放狀态和一些必要的屬性在MPMusicPlayerController.h檔案中一看便知。

對于音樂播放來說,背景播放才是王道;so,接下來說一下背景播放音樂

注意:測試的時候,模拟器背景音樂照常運作,是以請使用真機。

1、info.plist中設定

音頻播放(System Sound Services、MPMusicPlayerController、AVAudioplayer) for IOS

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]; //背景播放

}