ios 录制语音并播放 aud语音

语音逻辑:点击录音按钮,出现录音界面, 点击录音界面的按钮开始录音,上滑取消录音,松开发送录音


一、初始化语音设置

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值