AV Foundation(二.錄制和播放音頻)

1.音頻會話

簡單的理解,音頻會話就是音頻功能的抽象類,封裝了音頻的模式和一些功能.

1.1音頻會話

AVAudioSessionCategoryAmbient : 游戲,效率應(yīng)用程序 (混音模式,只能輸出音頻)
AVAudioSessionCategorySoloAmbient : 默認(rèn)模式,游戲,效率應(yīng)用程序(不能混音,只能輸出音頻)
AVAudioSessionCategoryPlayback : 音視頻播放(可以選擇是否混音,只能輸出音頻)
AVAudioSessionCategoryRecord : 錄音(不能混音,只能輸入音頻)
AVAudioSessionCategoryPlayAndRecord : 語音聊天(可以選擇是否混音,可以輸入和輸出音頻)
AVAudioSessionCategoryAudioProcessing : 離線會話和處理(沒有混音,不能輸入輸出音頻)
AVAudioSessionCategoryMultiRoute : 外部硬件(不能混音,可以輸入輸出音頻)
根據(jù)應(yīng)用程序的功能,去選擇音頻會話的模式,另外一些模式下還有可選的options和modes來進(jìn)一步滿足需求.
配置音頻會話

AVAudioSession * session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];

2 AVAudioPlayer

AVAudioPlayer只能播放本地音頻,通過文件url或者音頻NSData創(chuàng)建播放器示例.

NSURL *fileUrl = [[NSBundle mainBundle]URLForResource:@"audio" withExtension:@"mp3"];
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];
[player prepareToPlay];

[player prepareToPlay];是預(yù)備播放,把音頻加載到緩沖器,可以減小播放的延遲.

[player play];
[player pause];
[player stop];

play即播放,pause和stop都會暫停播放,不過stop會撤銷prepareToPlay時做的設(shè)置.
音量 volume 音量是從0.0到1.0
pan值 pan值是立體聲效果,從-1.0(左)到1.0(右),默認(rèn)是0.0(居中)
倍速 首先需要在prepareToPlay之前設(shè)置enableRate為YES.之后修改rate才會起效,范圍是0.5到2.0,這個倍速不會改變音調(diào).
循環(huán) numberOfLoops 設(shè)置n為循環(huán)n次,-1位無限循環(huán)
音頻計量可以獲取音頻的音量力度的平均值和峰值

一個完整的例子

2.1 處理中斷事件

AVAudioPlayer播放音頻時,電話呼入,鬧鐘響起等都會中斷音頻播放,但是在這之后,音頻不會自動恢復(fù),需要代碼來實(shí)現(xiàn)
音頻會話會在中斷事件時發(fā)送通知(AVAudioSessionInterruptionNotification). 在通知的userInfo字典中,有一個key(AVAudioSessionInterruptionTypeKey)對應(yīng)的枚舉值(AVAudioSessionInterruptionType)是中斷事件的類型,只有兩種,開始和結(jié)束.
并且如果是結(jié)束中斷的通知,userInfo還有一個AVAudioSessionInterruptionOptions的值來表明是否可以繼續(xù)播放音頻.

2.2 處理線路改變

當(dāng)輸出線路改變時,比如切換耳機(jī),外置麥克風(fēng)等設(shè)備,音頻會話會發(fā)送一個通知(AVAudioSessionRouteChangeNotification),userInfo中包含了前一個線路的信息,AVAudioSessionRouteChangeReasonKey對應(yīng)的值描述了線路變化的原因,其中耳機(jī)斷開包含在類型AVAudioSessionRouteChangeReasonOldDeviceUnavailable中
僅僅判斷類型是OldDeviceUnavailable是不夠的,userInfo中有一個AVAudioSessionRouteChangePreviousRouteKey,代碼示例如下

AVAudioSessionRouteDescription *desc = info[AVAudioSessionRouteChangePreviousRouteKey];
AVAudioSessionPortDescription *outPut = desc.outputs.firstObject;
NSString *type = outPut.portType;

portType是字符串,有很多種,其中AVAudioSessionPortHeadphones是耳機(jī).

3 錄制音頻

需要一個用來存儲的路徑, 一個配置信息字典

NSDictionary *settings = @{AVFormatIDKey:@(kAudioFormatMPEG4AAC),AVSampleRateKey:@22050.0f,AVNumberOfChannelsKey:@1,AVEncoderBitDepthHintKey:@16,AVEncoderAudioQualityKey:@(AVAudioQualityMedium)};
 AVAudioRecorder * recoder = [[AVAudioRecorder alloc]initWithURL:[NSURL URLWithString:@""] settings:settings error:nil];
[recoder record];
[recoder pause];
[recoder stop];

**3.1 音頻格式AVFormatIDKey
不同的格式需要對應(yīng)不同的擴(kuò)展名,最常用的是kAudioFormatMPEG4AAC的".aac"格式,另外caf擴(kuò)展名可以存儲所以音頻格式
**3.2 采樣率AVSampleRateKey
采樣率建議使用標(biāo)準(zhǔn)采樣率,8000,16000,22050,44100.采樣率越高,音頻質(zhì)量越高,文件越大.
**3.3通道數(shù)AVNumberOfChannelsKey
1是單聲道,2是立體聲
**3.4位深A(yù)VEncoderBitDepthHintKey
位深和采樣率一樣影響音頻的質(zhì)量,單位是dB,常用有8,16,24,32
**3.5質(zhì)量AVEncoderAudioQualityKey

4.測量音頻

[recoder updateMeters];
[recoder averagePowerForChannel:0];
[recoder peakPowerForChannel:0];

音頻的分貝是從-160dB到0dB,每當(dāng)要獲取分貝值時,首先需要調(diào)用[recoder updateMeters];,然后averagePowerForChannel獲取平均值,peakPowerForChannel獲取峰值,其中0是聲道,單聲道時,0就是唯一的聲道.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容