Part 2 :語音錄音機(jī)
其實(shí)網(wǎng)上很多錄音的文章,這里主要說明的是網(wǎng)絡(luò)傳輸音頻相關(guān)的內(nèi)容.
基本流程就是錄音結(jié)束后獲取一個(gè)wav
格式的錄音,轉(zhuǎn)換為amr
格式文件,轉(zhuǎn)成NSData
格式,用于傳輸.
amr
格式的文件大小是wav
格式文件大小的十分之一左右,更適合傳輸.
- 先創(chuàng)建兩個(gè)音頻文件到沙盒的Tmp文件夾中(Tmp存儲臨時(shí)數(shù)據(jù),iCloud 不會(huì)備份這些文件)
//創(chuàng)建緩存錄音文件到Tmp
NSString *wavRecordFilePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
NSString *amrRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryRadio.amr"];
if (![[NSFileManager defaultManager]fileExistsAtPath:wavRecordFilePath]) {
[[NSData data] writeToFile:wavRecordFilePath atomically:YES];
}
if (![[NSFileManager defaultManager]fileExistsAtPath:amrRecordFilePath]) {
[[NSData data] writeToFile:amrRecordFilePath atomically:YES];
}
WAVtemporaryRadio.wav
文件是錄音后的臨時(shí)存儲文件
AMRtemporaryRadio.amr
文件是用于網(wǎng)絡(luò)傳輸?shù)奈募?/p>
- 懶加載
AVAudioRecorder
- (AVAudioRecorder *)audioRecorder
{
if (!_audioRecorder) {
//暫存錄音文件路徑
NSString *wavRecordFilePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
NSDictionary *recordSetting = @{ AVSampleRateKey : @8000.0, // 采樣率
AVFormatIDKey : @(kAudioFormatLinearPCM), // 音頻格式
AVLinearPCMBitDepthKey : @16, // 采樣位數(shù) 默認(rèn) 16
AVNumberOfChannelsKey : @1 // 通道的數(shù)目
};
_audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:wavRecordFilePath] settings:recordSetting error:nil];
_audioRecorder.delegate = self;
_audioRecorder.meteringEnabled = YES;
}
return _audioRecorder;
}
- 開始錄音
[self.audioRecorder prepareToRecord];
[self.audioRecorder record];
- 開啟音頻值測量
double lowPassResults = pow(10, (0.05 * [_self->_audioRecorder peakPowerForChannel:0]));
- 完成錄音后,會(huì)進(jìn)入到
AVAudioRecorder
的代理方法中,(wave_file_to_amr_file
類demo中會(huì)有)
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
//暫存錄音文件路徑
NSString *wavRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WAVtemporaryRadio.wav"];
NSString *amrRecordFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"AMRtemporaryRadio.amr"];
//重點(diǎn):把wav錄音文件轉(zhuǎn)換成amr文件,用于網(wǎng)絡(luò)傳輸.amr文件大小是wav文件的十分之一左右
wave_file_to_amr_file([wavRecordFilePath cStringUsingEncoding:NSUTF8StringEncoding],[amrRecordFilePath cStringUsingEncoding:NSUTF8StringEncoding], 1, 16);
//返回amr音頻文件Data,用于傳輸或存儲
NSData *cacheAudioData = [NSData dataWithContentsOfFile:amrRecordFilePath];
if ([self.delegate respondsToSelector:@selector(audioRecorderDidFinishRecordingWithData:)]) {
[self.delegate audioRecorderDidFinishRecordingWithData:cacheAudioData];
}
}
Demo 地址 :https://github.com/XL-Andrew/ChatToolBarAudioButton