语音逻辑:点击录音按钮,出现录音界面, 点击录音界面的按钮开始录音,上滑取消录音,松开发送录音
一、初始化语音设置
1. 引入头文件,添加语音相关的代理
(1)在.h文件中 添加 #import <AVFoundation/AVFoundation.h> #import <AudioToolbox/AudioServices.h>
(2)定义使用的变量
@property (nonatomic, assign) CGFloat localProgress; //记录进度
@property (nonatomic, strong) NSTimer *recordTimer;//录音计时
@property (nonatomic, assign) BOOL isUp;//判断按钮是否抬起
@property (nonatomic, strong) NSDictionary *recorderSettingsDict;//语音设置
@property (nonatomic, strong) NSString *playName;//录音名字
@property (nonatomic, strong) AVAudioRecorder *recorder;//录音器
@property (nonatomic, strong) NSMutableArray *waveImages;//图片组
@property (nonatomic, assign) double lowPassResults; //音量大小
(2)初始化录音设置 调用函数 [self initRecordSetting];
- (void)initRecordSetting{
if (IOS7_OR_LATER)
{
//7.0第一次运行会提示,是否允许使用麦克风
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *sessionError;
//AVAudioSessionCategoryPlayAndRecord用于录音和播放
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if(session == nil)
NSLog(@"Error creating session: %@", [sessionError description]);
else
[session setActive:YES error:nil];
}
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
self.playName = [NSString stringWithFormat:@"%@/play.aud",docDir];
//录音设置
self.recorderSettingsDict =[[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
[NSNumber numberWithInt:1000.0],AVSampleRateKey,
[NSNumber numberWithInt:2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:8],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
sizeof (audioRouteOverride),&audioRouteOverride);
}
(3)定义按钮
UIButton* voice_bt = [UIButton alloc] init ]
[self.voice_bt addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown];
[self.voice_bt addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[self.voice_bt addTarget:self action:@selector(touchUpOutside:) forControlEvents:UIControlEventTouchUpOutside];
- (void)touchDown:(BeeUIButton*)sender{
//
self.isUp = NO;
if (self.whenTouchDown) {
//按下录音
if ([self canRecord]) {
NSError *error = nil;
//必须真机上测试,模拟器上可能会崩溃
self.recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:self.playName] settings:self.recorderSettingsDict error:&error];
if (self.recorder) {
self.recorder.meteringEnabled = YES;
[self.recorder prepareToRecord];
[self.recorder record];
//记录录音时间
self.recordTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/50.0 target:self selector:@selector(updateRecordTime:) userInfo:nil repeats:YES];
} else
{
int errorCode = CFSwapInt32HostToBig ([error code]);
NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode);
}
}
}
}
- (void)touchUpInside:(BeeUIButton*)sender{
self.isUp = YES;
if (self.whenTouchUp) {
if (self.recordTime < 0.6) {
NSLog(@"录音时间太短");
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
self.voice_tip.backgroundColor = [UIColor clearColor];
$(@"#voice_tip").TEXT(@"按住说话");
});
[self.recordTimer invalidate];
self.recordTimer = nil;
$(@"#progressView").HIDE();
return;
}
else
{
if(self.recordTime > 0.5)
{
//发送录音到调用录音界面的界面
self.whenSendVoice(self.playName, [NSString stringWithFormat:@"%@”", [[NSString stringWithFormat:@"%.2f", self.recordTime] substringWithRange:NSMakeRange(0, [NSString stringWithFormat:@"%.2f", self.recordTime].length-3)]]);
self.recordTime = 0.0;
[self.recordTimer invalidate];
self.recordTimer = nil;
[self.recorder stop];
self.recorder = nil;
$(@"#progressView").HIDE();
}
else
{
self.recordTime = 0.0;
[self.recordTimer invalidate];
self.recordTimer = nil;
[self.recorder stop];
self.recorder = nil;
$(@"#progressView").HIDE();
}
}
}
}
- (void)updateRecordTime:(NSTimer *)timer{
self.recordTime = self.recordTime + 1.0/50.0;
NSLog(@"%f",self.recordTime);
//检测音量大小
{
[self.recorder updateMeters];
double peakPowerForChannel = pow(10, (0.05 * [self.recorder peakPowerForChannel:0]));
self.lowPassResults = peakPowerForChannel;
NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [self.recorder averagePowerForChannel:0], [self.recorder peakPowerForChannel:0], self.lowPassResults);
//录音时,根据音量变化图片
if (self.lowPassResults>=0.8) {
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:8]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:17]]);
}else if(self.lowPassResults>=0.7){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:7]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:16]]);
}else if(self.lowPassResults>=0.6){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:6]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:15]]);
}else if(self.lowPassResults>=0.5){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:5]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:14]]);
}else if(self.lowPassResults>=0.4){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:4]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:13]]);
}else if(self.lowPassResults>=0.3){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:3]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:12]]);
}else if(self.lowPassResults>=0.2){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:2]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:11]]);
}else if(self.lowPassResults>=0.1){
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:1]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:10]]);
}else{
$(@"#left_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:0]]);
$(@"#right_wave").IMAGE([UIImage imageNamed:[self.waveImages objectAtIndex:9]]);
}
}
$(@"#voice_tip").ATTR(@"background-color", @"#2ECC71");
NSString *recordStr = [NSString stringWithFormat:@"%.2f", self.recordTime];
$(@"#voice_tip").TEXT(@"手指上滑,取消发送");
NSLog(@"%@",recordStr);
}
//判断是否允许使用麦克风7.0新增的方法requestRecordPermission
-(BOOL)canRecord
{
__block BOOL bCanRecord = YES;
if (IOS7_OR_LATER)
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
if (granted) {
bCanRecord = YES;
}
else {
bCanRecord = NO;
dispatch_async(dispatch_get_main_queue(), ^{
[[[UIAlertView alloc] initWithTitle:nil
message:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"
delegate:nil
cancelButtonTitle:@"关闭"
otherButtonTitles:nil] show];
});
}
}];
}
}
return bCanRecord;
}