音頻播放(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 = [[MPMediaPickerControllerallocinitWithMediaTypes: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]; //後臺播放

}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章