我已经构建了一个UIView,它通过浮点值输入绘制波形。我想要绘制的视图是通过麦克风输入录制的音频波形,同时录制它。我已经研究了一些框架,但我似乎无法找到任何以我提到的方式做到这一点的方法,而且我在实施方面遇到了一些麻烦。我用:
audioRecorder = try AVAudioRecorder(URL: soundURL, settings: settings)
audioRecorder.meteringEnabled = true
audioRecorder.recordForDuration(NSTimeInterval(20.0))
然后:
audioRecorder.updateMeters()
//this turns dBFS to a linear value from 0 to 1
let x = pow(10.0, ( Double(audioRecorder.peakPowerForChannel(0))/20 ))
//here I add the new meter value to my plotter view
waveForm.addnewValue(x)
正如您在下面的链接中所看到的,有许多平原区域,不仅仅是在"剪辑"区域,但也在较低的水平。我猜这是来自peakPowerForChannel()
在"米式"中返回其值的形式。方式,平滑所有输出。
https://i.stack.imgur.com/vuTCG.jpg
我不喜欢绘制音频的方式,因为我想要更像这样的内容:
https://i.stack.imgur.com/eSOtV.png
通过获取正在记录的样本的实际浮点值,我想我可以获得与每个样本的幅度相对应的实际值,并得到与我正在寻找的结果更相似的结果。
感谢您的帮助!
按照Rob Napier的建议实现调度计时器,并将dBFS中的除数更改为线性转换后,我唯一得到的是更加垂直压缩的波形,而不能实现我真正需要的所有效果(见上面的链接)。
在不同的点上仍然存在平坦的区域,并且当声音从声音转变为静音时,某种运行平均值似乎会影响波形。
这是我目前的代码:
var dTimer: DispatchTimer!
dTimer = DispatchTimer(seconds: 0.1) {
self.audioRecorder.updateMeters()
let x = pow(10.0, (Double(self.audioRecorder.peakPowerForChannel(0))/50))
self.waveForm.addnewValue(x)
}
问题是:有没有办法让AVAudioRecorder记录这些值,所以我可以将这些值设置为我的波形绘图仪的值?