使用AVAudioRecorder 錄音


自己項目中用到了錄音部分,本來想做一個關於錄音的開源項目的,想想還是寫博客好點。

錄音回話設置

復制代碼
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];

錄制完畢后調用上面切換成播放模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM