iOS 有很多方式讓系統發出聲音,這兒要提的是最簡單的一個,就是使用 AudioToolBox 提供的 System Sound。
首先我們先建立一個 Singel View 專案。在設所有的聲音相關處理時,預設是不會加入相關的 Framework 的,所以 

  

我們在開啟一個專案後,請依下列動作加入 相關的 Frame work:




1. 按下左上方的專案名稱

2. 按下上方例表的 Build Phases

3. 按下 Link Binary With Libraries 中的 + 

動作如下:(按圖開啟完整的圖)

insertFrameWork            

然後找到 AudioToolBox,並把它 Add 進去就可以了

audioToolBox  

最後,在主要的 ViewContorller.h 檔的最上方,加入

#import <AudioToolbox/AudioToolbox.h>


就完成 FrameWork 的加入了。由於這個一 FarmeWork 大多都是 C 寫的,所以要用 C 的概念去思考它,而不是 Objective-C。 


接下來我們來談談 Audio System Sound。 在 iOS 中,這是一個提示音,通常是用來作提示音,它支援一段一不超過 30 秒的聲音,但它不支援音量控制,也不支援中段暫停等,所以較常用在通知音或鍵盤按鍵音等狀況,它的聲音來源可以是 wav、caf 和 aif 檔等

 

要發出 System Sound 的動作很簡單,其實只有

 

1. 建立 SystemSound ID

2. 播放該ID的聲音


聽起來不難,但大多數的初學者並無法了解其中 Code 的意思,只能照作而已。

要建立一個 System Sound ID 要使用 AudioServicesCreateSystemSoundID() 的 Function, 格式如下:


 AudioServicesCreateSystemSoundID(CFURLRef inFileURL,SystemSoundID *outSystemSoundID)


一共有兩個參數,其中後一個 SystemSoundID *outSystemSoundID 比較簡單,就是一個 pointer, 用來儲存SoundID, 所以建一個 SystemSoundID 類型變數,再把指標給它就好了。
 

那第一個參數是什麼呢?它其實是指一個檔案的位置的URL 型式,這個過程有點複雜,共有三個動作要作第一件事就是要生成一個聲音檔案實際位置的字串。

檔案在 iOS 專案中並不能像是在電腦中一樣直接指定資料匣的位置,因為所有的 APP 都受限於自已能存取的空間中,而實際執行的資料匣位置,會包括執行硬的 ID 等資料,所以要對相前的檔案清單中取得,而方法就是

[[NSBundle mainBundle] pathForResource:檔案名稱 ofType:檔案格式]]

上面的這行程式中  [NSBundle mainBundle] 就是指目前的專案檔案資源,而 pathForResource:ofType 就會回傳一個檔案位置的實際字串,而檔案名稱與格式都是一個NSString,分別輸入檔案名(不含副檔名)與格式(即副檔名)。例如如果我們拉一個叫 ding.wav 我們想要知道它的實際位置,就可以

    NSString *myFile=[[NSBundlemainBundle] pathForResource:@"ding"ofType:@"wav"];

 

    NSLog(@"%@",myFile);


這一段 Code 就會輸出:
 

/Users/shenfive/Library/Application Support/iPhone Simulator/6.0/Applications/A5E5A905-38D0-462E-AE4E-DEF4780787F2/HelloSystemSound.app/ding.wav


我是在iPhoneSimulator 上執行的,這個位置中的 A5E5A905........ 就是機器的ID,也就是執行階段才產生的,所用我們要用這種方式取得。

取得檔案的位置字串後,我們就可以用下面的方法取得它的URL


NSURL *mySoundURL =[NSURL fileURLWithPath:mySoundFile];


最後得到的URL就可以轉型成 CFURLRef 給 AudioServicesCreateSystemSoundID(),另外如果你使用 ARC 記憶體管理,還要再加上 __bridge,所以產生一個 檔案為 ding.wav 的 SoundID 的完整範例為:

  

    SystemSoundID mySoundID;

    NSString *mySoundFile=[[NSBundlemainBundle] pathForResource:@"ding"ofType:@"wav"]; 

    NSURL *mySoundURL =[NSURL fileURLWithPath:mySoundFile];    

    AudioServicesCreateSystemSoundID((__bridgeCFURLRef)mySoundURL,&mySoundID);

 

最後使用 AudioServicePlaySystemSound(mySoundID) 就可以播放了。

arrow
arrow

    shenfive 發表在 痞客邦 留言(1) 人氣()