新QQ交流群:418536818,之前的群已满
-(void)doStartRecordName:(NSString *)name{
_cafName = name;
name = [NSString stringWithFormat:@"%@.caf",name];
NSString *cafFilePath = [self.tmpCAFPathstringByAppendingPathComponent:name];//创建录音存储路径
NSURL *cafURL = [NSURLfileURLWithPath:cafFilePath];
NSError *error;
NSLog(@"cafURL:%@" ,cafURL);
NSDictionary *recordFileSettings =
[[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],AVSampleRateKey, //采样率
[NSNumber numberWithInt: kAudioFormatLinearPCM],AVFormatIDKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采样位数 默认 16
[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,//通道的数目
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,//大端还是小端 是内存的组织方式
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,nil];//采样信号是整数还是浮点数
NSLog(@"cafURL=%@",cafURL);
self.avRecorder = [[AVAudioRecorderalloc]initWithURL:cafURL settings:recordFileSettingserror:&error];
self.avRecorder.delegate =self;
//开启音量检测
self.avRecorder.meteringEnabled =YES;
[self.avRecorderprepareToRecord];
[self.avRecorderrecord];
}
如题这个时候理论上是可以正常录音和测量音量的,实际情况却是真机的时候有问题,基本的就是声音没有变化,然后无法正常录音,当然在模拟器上是可以正常工作的。
这个时候需要加上下面一段代码,最好是有录音按钮页面启动的时候就添加
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error]; //设置音频类别,这里表示当应用启动,停掉后台其他音频
[audioSession setActive:YES error: &error];//设置当前应用音频活跃性
timer = [NSTimerscheduledTimerWithTimeInterval:0.1ftarget:selfselector:@selector(detectionVoice)userInfo:nilrepeats:YES];
/**
* 定时音量检测动画
*/
- (void)detectionVoice
{
[self.qn.avRecorderupdateMeters];//刷新音量数据
//获取音量的平均值 [recorder averagePowerForChannel:0];
//音量的最大值 [recorder peakPowerForChannel:0];
double lowPassResults = pow(10, (0.05 * [self.qn.avRecorderpeakPowerForChannel:0]));
NSLog(@"%lf",lowPassResults);
//最大50 0
//图片 小-》大
if (0<lowPassResults<=0.06) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_01.png"]];
}else if (0.06<lowPassResults<=0.13) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_02.png"]];
}else if (0.13<lowPassResults<=0.20) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_03.png"]];
}else if (0.20<lowPassResults<=0.27) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_04.png"]];
}else if (0.27<lowPassResults<=0.34) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_05.png"]];
}else if (0.34<lowPassResults<=0.41) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_06.png"]];
}else if (0.41<lowPassResults<=0.48) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_07.png"]];
}else if (0.48<lowPassResults<=0.55) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_08.png"]];
}else if (0.55<lowPassResults<=0.62) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_09.png"]];
}else if (0.62<lowPassResults<=0.69) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_10.png"]];
}else if (0.69<lowPassResults<=0.76) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_11.png"]];
}else if (0.76<lowPassResults<=0.83) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_12.png"]];
}else if (0.83<lowPassResults<=0.9) {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_13.png"]];
}else {
[self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_14.png"]];
}
}
//取消音量动画
[self.voiceHighImageViewremoveFromSuperview];
[timer invalidate];
timer = nil;
最后再扯一点,IOS和安卓录音格式不同便与通用应该转为MP3格式,lame是安卓和IOS通用的转换第三方文件
- (void)doChangeMP3{
NSString *fileName = _cafName;
fileName = [fileName stringByAppendingString:@".caf"];
NSString *cafFilePath = [self.tmpCAFPathstringByAppendingPathComponent:fileName];//caf文件地址
// NSString *cafFilePath =[_strCAFPath stringByAppendingPathComponent:cafFileName];
// NSDateFormatter *fileNameFormat=[[NSDateFormatter alloc] init];
// [fileNameFormat setDateFormat:@"yyyyMMddhhmmss"];
// NSString *mp3FileName = [fileNameFormat stringFromDate:[NSDate date]];
NSString * mp3FileName = _cafName;
mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];
NSString *mp3FilePath = [self.tmpMp3PathstringByAppendingPathComponent:mp3FileName];
@try {
int read, write;
FILE *pcm = fopen([cafFilePathcStringUsingEncoding:1], "rb");//被转换的文件
FILE *mp3 = fopen([mp3FilePathcStringUsingEncoding:1], "wb");//转换后文件的存放位置
const int PCM_SIZE =8192;
const int MP3_SIZE =8192;
short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE];
lame_t lame = lame_init();
lame_set_in_samplerate(lame,44100);
lame_set_VBR(lame,vbr_default);
lame_init_params(lame);
do {
read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
if (read == 0)
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
else
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, write, 1, mp3);
} while (read != 0);
lame_close(lame);
fclose(mp3);
fclose(pcm);
}
@catch (NSException *exception) {
NSLog(@"%@",[exceptiondescription]);
}
@finally {
}
if (self.mp3Path) {
self.mp3Path(mp3FilePath);//MP3地址
}
}