en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

1.02.2013

Core Audio 的 System Sound 音效播放


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);






6 則留言:

  1. 匿名7/12/2012

    請問”音效檔放入 Resource 中“
    裡面的“Resource”
    路徑是在哪裡阿???

    回覆刪除
    回覆
    1. 您好:

      Xcode 3.0 叫做 Resource
      Xcode 4.0 開始,改稱做 Supporting Files !!

      刪除
  2. 匿名7/18/2012

    請問有可以讓聲音暫停的指令嗎?
    還有繼續播放的指令?

    回覆刪除
    回覆
    1. 您好:

      這是用來播放音效的,音效是不能暫停的喔,你的需求應該是要播放「音樂」,你可以使用 AVAudioPlayer 來進行聲音的播放,請參考「使用 AVFoundation 來播放音樂」一文。
      http://furnacedigital.blogspot.tw/2010/12/avfoundation.html

      刪除
    2. 匿名7/19/2012

      我是想來當作APP的背景音樂
      用AVAudioPlayer好像會比較吃效能

      刪除
    3. 您好

      你可以試試看使用 AudioServicesDisposeSystemSoundID ,不過如果要從停止的地方再度播放,可能就沒有辦法了,

      稍後我會在文章中補上此用法。

      刪除