自己項目中用到了錄音部分,本來想做一個關於錄音的開源項目的,想想還是寫博客好點。
錄音回話設置
1 NSError *error = nil; 2 AVAudioSession * audioSession = [AVAudioSession sharedInstance]; //得到AVAudioSession單例對象 3 [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];//設置類別,表示該應用同時支持播放和錄音 4 [audioSession setActive:YES error: &error];//啟動音頻會話管理,此時會阻斷后台音樂的播放. 5 6 // 設置成揚聲器播放 7 UInt32 doChangeDefault = 1; 8 AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault);
1-4主要設置程序啟動錄音狀態,7-8設置的是默認為采用揚聲器狀態播放,如果你插入耳機,自動改變為耳機狀態。
錄音之前需要,先關閉播放音樂,如果不關閉,就開始錄音,就會出現紅色提示框,造成整個view抖動。不過不影響使用。所以在使用上面的代碼之前先調用代碼關閉音樂播放。
1 NSMutableDictionary *recordSetting = [NSMutableDictionary dictionary]; 2 [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 3 [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 4 [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; 5 [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 6 [recordSetting setValue:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsBigEndianKey]; 7 [recordSetting setValue:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsFloatKey];
我錄音的格式是ma4格式,采用這種格式的主要目的是,此格式錄音一分鍾生成的大小小於1M,剛好滿足蘋果官方的審核。這里單聲道和雙聲道大小還是有有一點區別的,但不太多。我非專業人士,聽不出來好壞。你也可以錄制完畢轉換成mp3格式。github上有一個開源的項目 https://github.com/rpplusplus/iOSMp3Recorder 錄制的各個參數我就不再分析。
接下來就是初始化,
1 NSError *error = nil; 2 AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:_recordFileURL settings:recordSettings error:&error];
_recordFileURL 是NSURL的文件路徑。
recordSettings 是上面的音頻格式設置。
設置錄音時間。得到輸入大小。完成委托。
1 [_recorder recordForDuration:(NSTimeInterval) 30.0 * 60.0]; 2 _recorder.meteringEnabled = YES; 3 [_recorder setDelegate:self];
1設置最長的錄音時間。2得到輸入大小,最大為60,最小為-60 。3設置設置委托,委托里面有兩個方法,一個當錄音完成調用,一個當出現中斷調用。
1 if ([_recorder prepareToRecord] == YES){ 2 [_recorder record]; 3 }
當准備好了就開始錄音,千萬不要只調用 prepareToRecord 方法,也許你第一次能調用成功,第二次不能調用成功。
然后就是設置動態顯示的東西,如動態的錄音時間,_recorder.currentTime;
得到波形圖。
1 - (void)updateMeters; /* call to refresh meter values */ 2 3 - (float)peakPowerForChannel:(NSUInteger)channelNumber; /* returns peak power in decibels for a given channel */ 4 - (float)averagePowerForChannel:(NSUInteger)channelNumber; /* returns average power in decibels for a given channel */
使用上面的方法得到每個聲道的輸入大小。每次都必須調用 updateMeters來更新為最新數據。
錄音部分,就完成了,當然你可以對應的使用AVAudioPlayer來播放錄制的聲音。
1 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 2 NSError *err = nil; 3 [audioSession setCategory :AVAudioSessionCategoryPlayback error:&err];
錄制完畢后調用上面切換成播放模式