聲音的用處 •聲效
■ 點擊按鈕
■ 警告聲
■ 使用者動作伴隨的短聲
• 任意長度的聲音(音樂,播客,講話內容) • 來自網路服務的音頻流
• 錄製的聲音
這會有多難?
• 在一個多功能的行動裝置上播放聲音可能令人驚訝 的複雜
■ 可能同時有多個來源
■ 無數可能的輸出
■ 變幻的事件,可能超出使用者的控制 ■ 給看上去類似的動作不同的優先順序
• 作業系統管理聲音系統
■ 再一次,你只需簡單的搭它的車
CoreAudio
• 高層級,容易使用
■ System Sound API - 短的聲音
■ AVAudioPlayer class - ObjC,簡單API
• 低層級,花費更多努力,但是有更多控制
AudioToolbox-錄製和播放,流處理,完全的控制
Audio Units - 處理聲音
OpenAL - 3D定位的聲音
• 使用哪個取決於你要做什麼
■ 許多情況下滿意於系統聲音和AVAudioPlayer
播放短音
• "短"指少於30秒
• 非常簡單的API,但是有限制 ■ 不能重複
■ 沒有音量控制 ■ 立刻播放
■ 有限的格式
■ 線性化的PCM或IMA4 ■ .caf,.aif或.wav檔案
播放短音
• 兩步的過程
■ 註冊這個聲音,返回一個"聲音ID“
■ 播放聲音
■ 當聲音播放結束時可選擇是否運行回呼函數
NSURL *fileURL = ... // 一個檔案的地址 SystemSoundID myID;
// 先註冊這個聲音
AudioServicesCreateSystemSoundID ((CFURLRef)fileURL, &myID);
// 現在可以播放這個聲音 AudioServicesPlaySystemSound (myID);
播放短音 •清理
■ 當你完成時清除聲音ID
■ 否則你會得到一個記憶體警告
SystemSoundID myID;
// 清除前面註冊的聲音 AudioServicesDisposeSystemSoundID (myID);
體會你的聲音
• 系統的聲音API允許促發手機的震動
• 使用這個特定的系統聲音ID kSystemSoundID_Vibrate ■ 在iPod touch上不做任何事情
- (void)vibrate { // 促發手機的震動
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
轉換聲音
• 轉換聲音的命令列工具
/usr/bin/afconvert
• 支援各種輸入和輸出格式 • 細節請查看man的頁面
• 可以容易的轉換聲音為系統聲音格式
/usr/bin/afconvert -f aiff -d BEI16 input.mp3 output.aif
播放長音
• iPhone OS 2.1之前的版本裡,你必須使用低層級的
CoreAudio APIs
■ 可能會很複雜,很麻煩
• iPhone OS 2.2引入了ObjC類來處理簡單的音頻播放
■ AVAudioPlayer
• 如果你要在期末項目裡使用聲音,更新到2.2版
AVAudioPlayer
• 播放長音(超過30秒)
• 本機存放區的檔案或記憶體裡的(或來自網路流)
• 能夠迴圈,跳動,播放,暫停
• 提供音量資訊
• 同時播放多個聲音
• Cocoa-風格的 API
■ 從檔案地址或資料初始化
■ 允許代理
AVAudioPlayer
• 從檔案地址或資料產生 AVAudioPlayer *player;
NSString *path = [[NSBundle mainBundle] pathForResource...];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url]; • 簡單的開始/停止方法
if (!player.playing) {
[player play];
} else {
[player pause];
}
AVAudioPlayerDelegate
• 告知什麼時候播放停止
• 告知音頻解碼錯誤
• 提供處理中斷的介面 ■ Oh,這些討厭的中斷
Audio Sessions
• 作業系統需要知道你在對聲音做什麼
■ 開始玩遊戲或收聽播客,然後鎖定設定...什麼會發生?
■ 如果你玩的是一個射擊遊戲並用發聲/靜音開關來靜音... 什麼會發生?
• 提供了一種方式讓你表達你的音頻目的 ■ Categories被定義用來弄清
■ 環境聲
■ 媒體播放
■ 錄製
■ 播放和錄製
預設Sessions
• 應用程式獲得預設session時會
■ 當播放你的聲音時(比如iPod音頻)其他聲音被靜音 ■ 使用發聲/靜音開關
■ 當使用者鎖定裝置時靜音
• 對許多應用程式這不錯,但是不一定適合你的應用程式 ■ 如果這樣,你需要使用Audio Session APIs
進階音頻
音頻檔案流服務和音頻佇列服務
支援各種格式
更多對回訪的控制
播放音頻流到網路
進階音頻
• 錄製聲音
■ 音頻佇列服務(簡述)
1. 產生一個隊列
2. 定義一個回呼函數來接收錄製的音頻資料
3. 開始隊列
4. 接收回呼函數的錄製資料,你必須儲存它
5. 停止該隊列
■ 更多細節查看iPhone Dev Center的樣本項目 SpeakHere