在 iPhone 應用或者是游戲的開發過程中,對聲音的支持是必不可少的。沒有音效的軟件是殘缺的,用戶體驗也會大打折扣,下面是自己對iPhone音頻的一點總結。
iPhone OS 音頻分類:
(1)High level, easy to use
•System Sound API - short sounds
•AVAudioPlayer class - ObjC, simple API
(2)Lower level, takes more effort but much more control
•Audio Toolbox - recording and playback, streaming, full control
•Audio Units - processing audio
•OpenAL
Sound effects音響效果:
•Button Clicks
•Alert Sounds
•Short Sounds Accompanying User Actions
iPhone OS 主要提供以下了幾種播放音頻的方法:
•System Sound Services
•AVAudioPlayer 類
•Audio Queue Services
•OpenAL
1. System Sound Services
System Sound Services 是最底層也是最簡單的聲音播放服務,調用
AudioServicesPlaySystemSound
這個方法就可以播放一些簡單的音頻文件,使用此方法只適合播放一些很小的提示或者警告音,因為它有很多限制:
■ 聲音長度要小于 5 秒(一說小于30秒)
■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
■ 打包成 .caf, .aif, 或者 .wav 的文件
■ 不能控制播放的進度
■ 調用方法后立即播放聲音
■ 沒有循環播放和立體聲控制
另外,它還可以調用系統的震動功能,方法也很簡單。具體的代碼可以參考官方的示例SysSound,但是官方的示例只有一些簡單的用法,從文檔中我們發現
可以通過 AudioServicesAddSystemSoundCompletion 方法為音頻播放添加 CallBack 函數,有了
CallBack 函數我們可以解決不少問題,比如可以克服 System Sound Services
本身不支持循環播放的問題。以下代碼可以實現一個在程序中循環播放的背景音樂:
- static void completionCallback (SystemSoundID mySSID) {
- // 音頻重放
- AudioServicesPlaySystemSound(mySSID);
- }
- - (void) playSound {
- // 獲得 main bundle
- CFBundleRef mainBundle;
- SystemSoundID soundFileObject;
- mainBundle = CFBundleGetMainBundle ();
- // 獲得聲音文件的URL
- CFURLRef soundFileURLRef = CFBundleCopyResourceURL (
- mainBundle,
- CFSTR ("background"),
- CFSTR ("wav"),
- NULL
- );
- // 創建 system sound 對象
- AudioServicesCreateSystemSoundID (
- soundFileURLRef,
- &soundFileObject
- );
- // 播放結束回調
- AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
- completionCallback,
- (void*) self);
- // 播放音頻
- AudioServicesPlaySystemSound(soundFileObject);
-
- }
復制代碼
2. AVAudioPlayer 類
AVAudioPlayer 是 AVFoundation.framework 中定義的一個類,所以使用要先在工程中引入
AVFoundation.framework。我們可以把 AVAudioPlayer
看作是一個高級的播放器,它支持廣泛的音頻格式,主要是以下這些格式:
■ AAC
■ AMR(AdaptiveMulti-Rate, aformatforspeech)
■ ALAC(AppleLossless)
■ iLBC(internetLowBitrateCodec, anotherformatforspeech)
■ IMA4(IMA/ADPCM)
■ linearPCM(uncompressed)
■ µ-lawanda-law
■ MP3(MPEG-1audiolayer3
AVAudioPlayer
可以播放任意長度的音頻文件、支持循環播放、可以同步播放多個音頻文件、控制播放進度以及從音頻文件的任意一點開始播放等,更高級的功能可以參考
AVAudioPlayer 的文檔。要使用 AVAudioPlayer 的對象播放文件,你只需為其指定一個音頻文件并設定一個實現了
AVAudioPlayerDelegate 協議的 delegate 對象。這里舉一個簡單的例子,和上一個例子一樣,實現一直循環播放的背景音樂:
- - (void) playBackgroundSoundEffect {
- NSString *soundFilePath =
- [[NSBundle mainBundle] pathForResource: @"background"
- ofType: @"wav"];
- NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
- AVAudioPlayer *newPlayer =
- [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
- error: nil];
- [fileURL release];
- self.player = newPlayer;
- [newPlayer release];
- [self.player prepareToPlay];
- [self.player setDelegate: self];
- self.player.numberOfLoops = -1; // 循環播放音頻,直到調用Stop方法
- [self.player play];
- }
復制代碼
可
以看到,只要將 AVAudioPlayer 的 numberOfLoops 屬性設為負數,音頻文件就會一直循環播放直到調用 stop
方法。AVAudioPlayer 同樣支持 Callback,這是 AVAudioPlayerDelegate 的一個可選 delegate
方法:
- - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
- if (player == self.player && flag == YES) {
- NSLog(@"Playback finish.");
- }
- }
復制代碼
另外,你可以隨時控制 AVAudioPlayer 對象的播放、暫停以及停止,通過判斷對象的狀態,分別調用 play、pause 和 stop 方法即可:
-
- -(IBAction) playOrPause: (id) sender {
- // 音頻控制邏輯
- if (self.player.playing) {
- [self.player pause];
- } else {
- [self.player play];
- }
復制代碼
雖
然 AVAudioPlayer 可以播放很多格式,但是我們在實際開發過程中還是最好使用一些沒有壓縮的格式,比如 WAVE
文件,這樣可以減少系統處理單元的資源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 連續播放 mp3
這類經過壓縮的音頻文件時,在連接處可能出現一定的間隔時間。
3. Audio Queue Services
如果以上兩種音頻播放的解決方案都無法滿足你的需求,那么我想你肯定需要使用 Audio Queue Services。使用
Audio Queue Services
對音頻進行播放,你可以完全實現對聲音的控制。例如,你可以在聲音數據從文件讀到內存緩沖區后對聲音進行一定處理再進行播放,從而實現對音頻的快速/慢速
播放的功能。因為 Audio Queue Services 相對復雜很多,Apple 官方已經把它整理為一本書了,具體可以參考 Audio
Queue Services Programming Guide 和 SpeakHere 的程序示例。
4. OpenAL
OpenAL 是一套跨平臺的開源的音頻處理接口,與圖形處理的 OpenGL
類似,它為音頻播放提供了一套更加優化的方案。它最適合開發游戲的音效,用法也與其他平臺下相同。iPhone 支持 OpenAL
1.1,具體的文檔可以參考 OpenAL 的網站
http://openal.org 和 oalTouch 的程序示例。
附件即:
oalTouch.rar (1.51 MB)
下載次數: 48
2009-11-27 18:50
下載消耗 金錢 1 兩
源代碼