如何从AVAudioRecorder录制的音频中获取浮点值?

时间:2016-10-11 17:34:55

标签: ios swift avaudiorecorder

我已经构建了一个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记录这些值,所以我可以将这些值设置为我的波形绘图仪的值?

0 个答案:

没有答案