美文网首页iOS
ios麦克风音量实时检测

ios麦克风音量实时检测

作者: 街角仰望 | 来源:发表于2019-03-08 14:09 被阅读7次

    一、引入系统库

    #import <AVFoundation/AVFoundation.h>
    

    二、全局变量声明

    @interface ViewController ()
    {
        AVAudioRecorder *recorder;
        NSTimer *levelTimer;
    }
    @property(nonatomic,strong)UILabel *labelVoice;
    @property(nonatomic,strong)CALayer *layerVoice;
    
    @end
    

    三、功能部分

    1、UI部分

    - (UILabel *)labelVoice
    {
        if (!_labelVoice)
        {
            _labelVoice = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 120, 50)];
            _labelVoice.backgroundColor = [UIColor orangeColor];
            
            self.layerVoice = [CALayer layer];
            self.layerVoice.backgroundColor = [[UIColor greenColor]CGColor];
            self.layerVoice.frame = _labelVoice.bounds;
            [_labelVoice.layer addSublayer:_layerVoice];
        }
        return _labelVoice;
    }
    

    2、功能部分

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.view addSubview:self.labelVoice];
        
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth error:nil];
        
        /* 不需要保存录音文件 */
        NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
        
        NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
                                  [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                                  [NSNumber numberWithInt: 2], AVNumberOfChannelsKey,
                                  [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
                                  nil];
        
        NSError *error;
        recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
        if (recorder)
        {
            [recorder prepareToRecord];
            recorder.meteringEnabled = YES;
            [recorder record];
            levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.3 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
        }
        else
        {
            NSLog(@"%@", [error description]);
        }
    }
    
    /* 该方法确实会随环境音量变化而变化,但具体分贝值是否准确暂时没有研究 */
    - (void)levelTimerCallback:(NSTimer *)timer {
        [recorder updateMeters];
        
        float   level;                // The linear 0.0 .. 1.0 value we need.
        float   minDecibels = -60.0f; // use -80db Or use -60dB, which I measured in a silent room.
        float   decibels    = [recorder averagePowerForChannel:0];
        
        if (decibels < minDecibels)
        {
            level = 0.0f;
        }
        else if (decibels >= 0.0f)
        {
            level = 1.0f;
        }
        else
        {
            float   root            = 5.0f; //modified level from 2.0 to 5.0 is neast to real test
            float   minAmp          = powf(10.0f, 0.05f * minDecibels);
            float   inverseAmpRange = 1.0f / (1.0f - minAmp);
            float   amp             = powf(10.0f, 0.05f * decibels);
            float   adjAmp          = (amp - minAmp) * inverseAmpRange;
            
            level = powf(adjAmp, 1.0f / root);
        }
        
        /* level 范围[0 ~ 1], 转为[0 ~120] 之间 */
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"voice updated :%f",level * 120);
            self.layerVoice.frame = CGRectMake(0, 0, level * 120, 50);
        });
    }
    

    参考:
    https://blog.csdn.net/u012198553/article/details/87903084

    相关文章

      网友评论

        本文标题:ios麦克风音量实时检测

        本文链接:https://www.haomeiwen.com/subject/dbuxpqtx.html