zoukankan      html  css  js  c++  java
  • AVAudioRecorder、AVAudioPlayer录音及播放

    #pragma mark -  设置录制的音频文件的位置
    - (NSString *)audioRecordingPath{
        NSString *str_date=[TimeTransform DateToStringWithFormat:[NSDate date] withFormatString:@"yyyyMMDDHHmmss"];
        AvdioName=str_date;
        NSString *result = nil;
        NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsFolde = [folders objectAtIndex:0];
        result = [documentsFolde stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.aac",str_date]];
        return (result);
    }
    
    #pragma mark -根据文件名获取文件路径
    -(NSString *)getRecordingPathWithName:(NSString *)name{
        NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsFolde = [folders objectAtIndex:0];
        NSString *result = nil;
        result = [documentsFolde stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.aac",name]];
        return result;
    }
    
    
    
    #pragma mark -录音按钮
    -(void)SoundAction:(UILongPressGestureRecognizer *)gestureRecognizer{
       
        if (gestureRecognizer.state==UIGestureRecognizerStateBegan) {
            NSLog(@"UIGestureRecognizerStateBegan");
            
            //按下录音
            if ([self canRecord]) {
                
                NSError *error = nil;
                //必须真机上测试,模拟器上可能会崩溃
                recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:[self audioRecordingPath]] settings:recorderSettingsDict error:&error];
                
                if (recorder) {
                    recorder.meteringEnabled = YES;
                    [recorder prepareToRecord];
                    [recorder record];
                    
                    //启动定时器
                    timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(levelTimer:) userInfo:nil repeats:YES];
                    NSLog(@"录制声音开始!");
                    
                    [self performSelector:@selector(stopRecordingOnAudioRecorder:)
                               withObject:recorder
                               afterDelay:10.0f];
                    [view_black_bg setHidden:false];
                } else
                {
                    int errorCode = CFSwapInt32HostToBig ([error code]);
                    NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode);
                    
                }
            }
           
            
        }else if (gestureRecognizer.state==UIGestureRecognizerStateEnded){
            NSLog(@"UIGestureRecognizerStateEnded");
            [lb_audio_title setText:AvdioName];
            [self stopRecordingOnAudioRecorder:recorder];
            [timer invalidate];
            [view_black_bg setHidden:YES];
        }
    }
    
    
    
    -(void)levelTimer:(NSTimer*)timer_
    {
        //call to refresh meter values刷新平均和峰值功率,此计数是以对数刻度计量的,-160表示完全安静,0表示最大输入值
        [recorder updateMeters];
        const double ALPHAa = 0.05;
        double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
        lowPassResults = ALPHAa * peakPowerForChannel + (1.0 - ALPHAa) * lowPassResults;
        
        NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults);
        
    //    if (lowPassResults>=0.8) {
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:7]];
    //    }else if(lowPassResults>=0.7){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:6]];
    //    }else if(lowPassResults>=0.6){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:5]];
    //    }else if(lowPassResults>=0.5){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:4]];
    //    }else if(lowPassResults>=0.4){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:3]];
    //    }else if(lowPassResults>=0.3){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:2]];
    //    }else if(lowPassResults>=0.2){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:1]];
    //    }else if(lowPassResults>=0.1){
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:0]];
    //    }else{
    //        soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:0]];
    //    }
        
    }
    
    //判断是否允许使用麦克风7.0新增的方法requestRecordPermission
    -(BOOL)canRecord
    {
        __block BOOL bCanRecord = YES;
        if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending)
        {
            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需要访问您的麦克风。
    请启用麦克风-设置/隐私/麦克风"
                                                       delegate:nil
                                              cancelButtonTitle:@"关闭"
                                              otherButtonTitles:nil] show];
                        });
                    }
                }];
            }
        }
        
        return bCanRecord;
    }
    
    #pragma mark -停止音频的录制
    - (void)stopRecordingOnAudioRecorder:(AVAudioRecorder *)record{
        
        [recorder stop];
        recorder=nil;
        
        //结束定时器
        [timer invalidate];
        timer = nil;
    }
    /**
     *  录音完成,录音完成后播放录音
     *
     *  @param recorder 录音机对象
     *  @param flag     是否成功
     */
    -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{
        
      
    }
    
  • 相关阅读:
    redis 中 发布订阅 的 数据类型
    excelExport.js 导出 excel 表格
    Go 出现:err is shadowed during return(err在返回过程中被隐藏)
    Go 服务端 向 firebase Android 端 fcm 信息
    Python全栈day 03
    Python全栈day 01
    开发流程与版本管理规范
    php 魔术常量
    sql 消除重复
    重置mysql密码
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/5082489.html
Copyright © 2011-2022 走看看