声音分贝测量、曲线绘制
2016-12-02 本文已影响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]; // 曲线数组设置
});
}
曲线动画
Demo地址 Demo