System Sound 是在 iOS Core Audio 中用來播放音效的一種方法, 它支援 wav、caf 和 aif 等音效格式,System Sound 主要被用來播放一些簡短的音效,所以它不支援音量的控制,也沒有 Pause 和 Playback 等功能,如果您是在尋找音樂的播放方式,請參考使用 AVAudioPlayer 來播放音樂一文。
若要使用 System Sound 來播放音效,必須透過 iOS SDK 所提供的 AudioToolbox Framework 來完成,所以首先我們必須先以手動的方式替專案新增 AudioToolbox .framework,並且引用對應的標頭檔。
手動替專案增加 AudioToolbox.framework |
#import <AudioToolbox/AudioToolbox.h>
對於新增 Framework 有問題的讀者們,請參考 Xcode 4 新增 Framework 的方法一文。
註冊音效
在註冊音效方面,是將專案內的音效檔轉換成 SystemSoundID 的形態格式,因為在使用 System Sound 播放音效時,是以 SystemSoundID 的形態參數來做播放,而之後對該音效所做的任何處理,也都是以 SystemSoundID 型態參數為主。
//將音效檔轉換成SystemSoundID型態
SystemSoundID soundID;
NSURL *sound_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"file_name" ofType:@"wav"]];
AudioServicesCreateSystemSoundID((CFURLRef)sound_url, &soundID);
播放音效
在取得該音效的 SystemSoundID 之後,就可以使用以下方法對該音效進行播放的動作。
AudioServicesPlaySystemSound(soundID);
停止音效
停止音效,這裡意指將音效進行注銷,也就是將該音效的 SystemSoundID 從記憶體中抹去,當你移除該音效 SystemSoundID 的同時,音效也會隨之停止,你也可以透過此方式來釋放音效所佔用的記憶體。
AudioServicesDisposeSystemSoundID(soundID);
播放震動
在 SystemSound 中,「震動」也有屬於自己的 SystemSoundID -- kSystemSoundID_Vibrate,透過這個 SystemSoundID 你也可以讓 Device 「播放震動」(震動 0.4 秒與 0.1 秒閒置)。
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
播放音效同時震動
若是想要播放音效的同時也發出震動來做提示,可以參考以下方式,這樣音效和震動就會同步進行播放。
AudioServicesPlayAlertSound(soundID);
音效播放結束時的處理
在這裡提供一個方法,讓音效播放完成時做對應的處理動作,像是重複播放此音效,或是釋放此音效資源等,你可以參考以下程式碼,讓特定音效播放結束時會去呼叫對應的方法函式。
//設定音效播放完成時的通知處理
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, systemSoundCompletion, NULL);
//被呼叫的方法函式(必須是靜態的)
static void systemSoundCompletion(SystemSoundID sound_id, void* user_data) {
//重複播放相同的音效
AudioServicesPlaySystemSound(sound_id);
}
另外,我們也可以取消特定音效與該函式所做的連結,讓音效在播放完成之後,不會再去觸發此方法函式。
取消音效播放完成時的通知處理
AudioServicesRemoveSystemSoundCompletion(soundID);
請問”音效檔放入 Resource 中“
回覆刪除裡面的“Resource”
路徑是在哪裡阿???
您好:
刪除Xcode 3.0 叫做 Resource
Xcode 4.0 開始,改稱做 Supporting Files !!
請問有可以讓聲音暫停的指令嗎?
回覆刪除還有繼續播放的指令?
您好:
刪除這是用來播放音效的,音效是不能暫停的喔,你的需求應該是要播放「音樂」,你可以使用 AVAudioPlayer 來進行聲音的播放,請參考「使用 AVFoundation 來播放音樂」一文。
http://furnacedigital.blogspot.tw/2010/12/avfoundation.html
我是想來當作APP的背景音樂
刪除用AVAudioPlayer好像會比較吃效能
您好
刪除你可以試試看使用 AudioServicesDisposeSystemSoundID ,不過如果要從停止的地方再度播放,可能就沒有辦法了,
稍後我會在文章中補上此用法。