使用 AVAudioPlayer 播放音頻
????音頻播放是很多應(yīng)用程序的常見需求翅雏, AV Foundation 提供了一個(gè) AVAudioPlayer
的類使得音頻播放的實(shí)現(xiàn)變得非常簡單。使用 AVAudioPlayer
橄妆,我們可以:
- 從文件或內(nèi)存中播放任何持續(xù)時(shí)間的音頻
- 控制播放音頻的音量、平移慌随、速率和循環(huán)行為
- 訪問播放級計(jì)量數(shù)據(jù)
- 通過同步多個(gè)播放器的播放同時(shí)播放多個(gè)聲音
創(chuàng)建音頻播放器
????有兩種方法可以創(chuàng)建一個(gè) AVAudioPlayer
,使用包含要播放音頻的 NSData
或者本地音頻文件的 NSURL
蹋艺。下面示例演示了如何使用音頻文件路徑創(chuàng)建一個(gè) AVAudioPlayer
實(shí)例:
- (AVAudioPlayer *)playerForFile:(NSString *)name {
NSURL *fileURL = <#音頻路徑#>;
NSError *error;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
error:&error];
if (player) {
[player prepareToPlay];
} else {
NSLog(@"Error creating player: %@", [error localizedDescription]);
}
return player;
}
????如果創(chuàng)建了一個(gè)有效的播放示例,建議開發(fā)者調(diào)用其 prepareToPlay
方法畏邢,這樣做會(huì)取得需要的音頻硬件并預(yù)加載 Audio Queue 的緩沖區(qū)舒萎。調(diào)用 prepareToPlay
方法可以在創(chuàng)建時(shí)準(zhǔn)備播放器臂寝,從而降低調(diào)用 play
方法和聽到聲音輸出之間的延時(shí)咆贬。
對播放進(jìn)行控制
???? AVAudioPlayer
實(shí)例包含了所有開發(fā)者期望的對播放行為進(jìn)行控制的方法,調(diào)用 play
方法可以實(shí)現(xiàn)立即播放音頻的功能根欧, pause
方法可以對播放暫停今豆,而 stop
方法可以停止播放行為。 pause
和 stop
兩種最主要的區(qū)別是在底層處理上灰瞻, 調(diào)用 stop
方法會(huì)撤銷調(diào)用 prepareToPlay
時(shí)所做的設(shè)置璃弄,而調(diào)用 pause
方法不會(huì)。
除此之外茁肠,還可以使用其它方法,如下所示:
- 通過設(shè)置
volume
修改播放器的音量印蓖,從 0.0 ~ 1.0; - 通過設(shè)置
pan
修改音頻播放器的立體聲平移京腥,從 -1.0 ~ 1.0赦肃; - 通過設(shè)置
rate
調(diào)整播放速度,從 0.5 ~ 2.0; - 通過設(shè)置
numberOfLoops
實(shí)現(xiàn)循環(huán)播放次數(shù)
使用 AVAudioRecorder 錄制音頻
????AVAudioRecorder
同其用于播放音頻的兄弟類一樣他宛,構(gòu)建于 Audio Queue Services 之上船侧,我們可以使用這個(gè)功能從內(nèi)置的麥克風(fēng)或者外部音頻設(shè)備進(jìn)行錄制。
使用AVAudioRecorder
可以:
- 從系統(tǒng)的活動(dòng)輸入設(shè)備錄制音頻
- 錄制指定的持續(xù)時(shí)間或直到用戶停止錄制
- 暫停和恢復(fù)錄制
- 訪問記錄計(jì)量數(shù)據(jù)
創(chuàng)建 AVAudioRecorder
????創(chuàng)建 AVAudioRecorder
實(shí)例時(shí)需要為其提供數(shù)據(jù)的一些信息厅各,分別是:
- 用于表示音頻流寫入文件的本地文件
URL
- 包含用于配置錄音會(huì)話鍵值信息的
NSDictionary
對象 - 用于捕捉初始化階段各種錯(cuò)誤的
NSError
指針
NSURL *fileURL = <#表示音頻流寫入文件的本地文件#>镜撩;
NSDictionary *settings = @{
AVFormatIDKey : @(kAudioFormatAppleIMA4),
AVSampleRateKey : @44100.0f,
AVNumberOfChannelsKey : @1,
AVEncoderBitDepthHintKey : @16,
AVEncoderAudioQualityKey : @(AVAudioQualityMedium)
};
NSError *error;
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
} else {
NSLog(@"Error: %@", [error localizedDescription]);
}
????成功創(chuàng)建 AVAudioRecorder
實(shí)例后,建議調(diào)用 prepareToRecord
方法队塘。這個(gè)方法執(zhí)行底層 Audio Queue 初始化的必要過程袁梗。該方法還會(huì)在參數(shù)指定的位置創(chuàng)建一個(gè)文件。
錄音配置參數(shù)
????開發(fā)者可以配置錄音會(huì)話的完整鍵值信息在 <AVFoundation/AVAudioSettings.h>
中定義憔古,大部分的鍵都專門定義了特有的格式遮怜,如下所示一些通用的格式:
-
AVFormatIDKey
音頻格式kAudioFormatLinearPCM
kAudioFormatMPEG4AAC
kAudioFormatAppleLossless
kAudioFormatAppleIMA4
kAudioFormatiLBC
kAudioFormatULaw
AVSampleRateKey
采樣率AVNumberOfChannelsKey
通道數(shù)
控制錄音過程
????創(chuàng)建了 AVAudioRecorder
實(shí)例后,就可以開始錄音了鸿市。 和 AVAudioPlayer
類似地奈泪, AVAudioRecorder
同樣包含了對錄制行為進(jìn)行控制的方法如下所示:
- 調(diào)用
record
開始無限時(shí)長的錄制 - 調(diào)用
recordAtTime
在未來某一時(shí)間點(diǎn)開始錄制 - 調(diào)用
recordForDuration
錄制指定時(shí)長的內(nèi)容 - 調(diào)用
pause
暫停錄制 - 調(diào)用
stop
停止錄制
使用 Audio Metering
????AVAudioRecorder
和 AVAudioPlayer
中最強(qiáng)大和最實(shí)用的功能就是對音頻進(jìn)行測量。 Audio Metering 可以讓開發(fā)者讀取音頻的平均分貝和峰值分貝數(shù)據(jù)灸芳,并使用這些數(shù)據(jù)以可視化方式將聲音的大小呈現(xiàn)給用戶涝桅。
????兩個(gè)類使用的方法都是 averagePowerForChannel:
和 peakPowerForChannel:
。兩個(gè)方法會(huì)返回一個(gè)用于表示聲音分貝(dB)等級的浮點(diǎn)數(shù)烙样。這個(gè)值的范圍從表示最大分貝的 0 dB 到表示最小分貝的 -160 dB冯遂。
????在讀取這些值之前,首先要通過設(shè)置 meteringEnable
屬性為 true
才可以對音頻進(jìn)行測量谒获。每當(dāng)需要讀值時(shí)蛤肌,要先調(diào)用 updateMeters
方法才能獲取最新的值。