公司下個(gè)版本計(jì)劃要做音頻的錄制與播放授帕,這塊沒怎么接觸過,一邊學(xué)習(xí)一邊踩坑浮梢,下面就給大家做個(gè)分享跛十,共同進(jìn)步。這里也貼出我寫的DEMO(代碼使用了鏈?zhǔn)骄幊趟枷腼跸酰彩菍W(xué)習(xí)階段芥映,歡迎指正),歡迎使用和star远豺!
錄音
音頻任務(wù)初始化
我們這里用的是NB的AVFoundation框架奈偏,這里使用AudioSession來(lái)對(duì)音頻任務(wù)做處理,無(wú)論是錄制還是播放都需要做這一步躯护。初始化任務(wù):
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *sessionError;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if(session == nil){
NSLog(@"Error creating session: %@", [sessionError description]);
}else{
[session setActive:YES error:nil];//激活當(dāng)前session
}
如果不做初始化惊来,直接使用AudioRecorder的話,錄制出來(lái)是沒有任何聲音的棺滞,下面幾點(diǎn)就是原因裁蚁,也是它的主要功能:
1.為app選擇輸入輸出的路由 (通過揚(yáng)聲器還是聽筒播放)
2.協(xié)調(diào)音頻播放的app之間的關(guān)聯(lián)矢渊,以及系統(tǒng)的聲音處理
3.處理被其他apps打斷
4.創(chuàng)建一個(gè)錄音或者播放音樂的任務(wù)
而這里的參數(shù)AVAudioSessionCategoryPlayAndRecord
需要說明一下,可以根據(jù)實(shí)際情況選擇:
* AVAudioSessionCategorySoloAmbient
會(huì)停止其他程序的音頻播放枉证。當(dāng)設(shè)備被設(shè)置為靜音模式矮男,app也同樣被停止
* AVAudioSessionCategoryRecord
僅用來(lái)錄音,無(wú)法播放音頻
* AVAudioSessionCategoryPlayback
會(huì)停止其它音頻播放刽严,并且能在后臺(tái)播放昂灵,鎖屏and靜音模式下均可
* AVAudioSessionCategoryPlayAndRecord
能播也能錄,播放默認(rèn)聲音是從聽筒出來(lái)
* AVAudioSessionCategoryAmbient
app的聲音可與其它app共存舞萄,但鎖屏和靜音情況會(huì)被停止眨补,除非當(dāng)前app是唯一播放的app
初始化錄音器
錄音需要調(diào)用AVAudioRecorder,下面代碼用于初始化錄音器:
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
playName = [NSString stringWithFormat:@"%@/play.aac",docDir];
//錄音設(shè)置
recorderSettingsDict =[[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
[NSNumber numberWithInt:8000],AVSampleRateKey,
[NSNumber numberWithInt:1],AVNumberOfChannelsKey,
AVAudioQualityHigh,AVEncoderAudioQualityKey,
nil];
NSError *error = nil;
//必須真機(jī)上測(cè)試,模擬器上可能會(huì)崩潰
_recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:playName] settings:recorderSettingsDict error:&error];
先給大家看一下初始化字典里面的參數(shù):
AVFormatIDKey
——音頻格式倒脓,主要有一下支持格式:
kAudioFormatLinearPCM
kAudioFormatMPEG4AAC
kAudioFormatAppleLossless
kAudioFormatAppleMA4
kAudioFormatiLBC
kAudioFormatULaw
選擇kAudioFormatLinearPCM會(huì)將未壓縮的音頻流寫入到文件中.這種格式保真度最高,不過相應(yīng)的文件也最大.選擇諸如kAudioFormatMPEG4AAC或者kAudioFormatAppleMA4的壓縮格式會(huì)顯著縮小文件,也能保證高質(zhì)量的音頻內(nèi)容撑螺。我這里選擇的是kAudioFormatMPEG4AAC,而且安卓和蘋果都支持播放。
AVSampleRateKey
——采樣率崎弃,單位HZ甘晤,采樣率越小聲音質(zhì)量越低,通常有8000/44100/96000饲做,采樣率必須要設(shè)為11025才能使轉(zhuǎn)化成mp3格式后不會(huì)失真
AVNumberOfChannelsKey
——聲道數(shù)线婚,1或2,除非使用外部硬件,否則通常應(yīng)當(dāng)創(chuàng)建單聲道錄音盆均。通常單聲道足以滿足我們錄音功能的需要塞弊。
AVEncoderAudioQualityKey
——錄音音質(zhì),是一個(gè)枚舉值泪姨,這里我選AVAudioQualityHigh中等質(zhì)量游沿。
更多參考鏈接
開始錄制
_recorder.meteringEnabled = YES;//設(shè)置yes才能監(jiān)測(cè)輸入的音量大小,可以用作用戶界面反饋
[_recorder record];
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:volumeObserverMargin target:weakSelf selector:@selector(levelTimer:) userInfo:nil repeats:YES];//新建一個(gè)計(jì)時(shí)器用作測(cè)量音量大小
監(jiān)測(cè)音量
//輸入聲音的分貝大小計(jì)算
[_recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [_recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
停止錄音
_recorder stop];
_recorder = nil;
//結(jié)束定時(shí)器
[volumeTimer invalidate];
volumeTimer = nil;
播放本地錄音
這里分兩步操作肮砾,一是播放本地音頻诀黍,二是進(jìn)行進(jìn)度監(jiān)聽
播放本地音頻
[playerLocal play];
progressTimer = [NSTimer scheduledTimerWithTimeInterval:playerTimeObserverMargin target:self selector:@selector(recorderTimeViewer) userInfo:nil repeats:YES];//新建計(jì)時(shí)器監(jiān)聽播放進(jìn)度
播放進(jìn)度監(jiān)聽
NSLog(@"總時(shí)長(zhǎng):%f--當(dāng)前時(shí)間點(diǎn):%f",_playerLocal.duration,_playerLocal.currentTime);
播放網(wǎng)絡(luò)音頻
_songItem = [[AVPlayerItem alloc]initWithURL:url];
_playerNetwork = [[AVPlayer alloc]initWithPlayerItem:_songItem];
[_playerNetwork play];
獲取網(wǎng)絡(luò)資源總時(shí)長(zhǎng)的方法:
netAudioTime = CMTimeGetSeconds(_songItem.asset.duration);
Tips
1..plist文件中加入麥克風(fēng)請(qǐng)求權(quán)限
2.如果需要播放網(wǎng)絡(luò)音頻,添加App Transport Security Settings
下的Allow Arbitrary Loads
并設(shè)置為YES
3.如果需要app支持后臺(tái)播放音頻仗处,需要打開Capabilities
下面Background Modes
下面的Audio,AirPlay,and Picture in Picture
選項(xiàng)眯勾,但是審核的時(shí)候蘋果如果認(rèn)為你沒有必要打開這個(gè)功能,會(huì)被拒哦婆誓!
4.不用外接設(shè)備錄音和播放會(huì)聲音小咒精,解決辦法是播放前加入下面代碼:
NSError *audioError = nil;
BOOL success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&audioError];
if(!success)
{
NSLog(@"error doing outputaudioportoverride - %@", [audioError localizedDescription]);
}
Tips one more
完整功能的demo已經(jīng)更新,分別實(shí)現(xiàn)了錄音旷档、播放本地錄音和播放網(wǎng)絡(luò)音頻的播放
、暫停
歇拆、繼續(xù)
鞋屈、停止
范咨。使用可以參照demo。