美文网首页兴趣iOS
声音分贝测量、曲线绘制

声音分贝测量、曲线绘制

作者: 沧海的风 | 来源:发表于2016-12-02 13:36 被阅读195次

    先看一张效果图

    效果图.jpg

    音频可视化效果

    最上面是音频可视化效果图,参考资料:

    EZAudio

    一个用于iOS和OS X开发的音频可视化框架,基于高性能、低延迟的AudioUnits API,只需要简单地导入,并提供了使用Objective-C语言编写的易于使用的API,而不是纯粹的C语言。EZAudio提供了六个音频组件和两个界面组件:

    • EZAudioDevice:用于在任何苹果设备上获取所有当前可用的输入/输出的实用类。EZMicrophone和EZOutput两个类使用它来指导不同硬件组件的音频输入/输出。
    • EZMicrophone:从默认设备的麦克风提供其音频数据代理的麦克风类。
    • EZOutput:可以播放任何由数据源提供的音频的输出类。
    • EZAudioFile:通过音频文件读取/查找音频并提供使用回调函数的音频文件类。
    • EZAudioPlayer:AVAudioPlayer的替代品,与EZAudioFile和EZOutput两个类共同实现了在硬件设备上对任何音频文件的稳定播放。
    • EZRecorder:提供将任何数据源写入音频文件的简单快捷方法的记录类。
    • EZAudioPlot:一个基于核芯显卡将任何浮点型数组可视化处理成缓冲区或滚动点的音频波形绘制组件。
    • EZAudioPlotGL:一个基于OpenGL将任何浮点型数组可视化处理成缓冲区或滚动点的GPU加速音频波形绘制组件。

    ZLHistogramAudioPlot

    音频可视化库,使用EZAudio

    声音分贝值

      /* 声音测量*/
    - (void)levelTimerCallback:(NSTimer *)timer {
        [self.recorder updateMeters]; // 更新测量数据,注意只有meteringEnabled为YES此方法才可用
    
        float   level;                // The linear 0.0 .. 1.0 value we need.
        float   minDecibels = - 80.0f; // Or use -60dB, which I measured in a silent room.
        float   decibels    = [self.recorder averagePowerForChannel:0];
    
        if (decibels < minDecibels) {
            level = 0.0f;
        } else if (decibels >= 0.0f) {
            level = 1.0f;
        } else {
            float   root            = 2.0f;
            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(), ^{
            NSString *valueString = [NSString stringWithFormat:@"%.0f", level*120];
            NSString *string = [NSString stringWithFormat:@"%@ dB",valueString];
            NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:string];
            NSRange range2 = [string rangeOfString:valueString];
            [str addAttribute:NSFontAttributeName value:DinCondMedium(72) range:range2];
        
            if (_timeCount%10 == 0) {
                dbDescLabel.attributedText = str;
            }
            _timeCount++;
          
            if (self.decibeLineArray.count > kScreenWidth) {
                [self.decibeLineArray removeObjectAtIndex:0];
            }
            [self.decibeLineArray addObject:[NSString stringWithFormat:@"%.0f",level*120/167*18*5]];
            self.graphView.frame = CGRectMake(10, kScreenHeight-200, self.decibeLineArray.count, 180);
          [self.graphView setArray:self.decibeLineArray]; // 曲线数组设置
        });
    }
    

    曲线动画

    GraphView

    Demo地址 Demo

    相关文章

      网友评论

        本文标题:声音分贝测量、曲线绘制

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