我研究过在
installTap
中使用 AVAudioNode
,但是如何在 installTap
中实时获取音量级别?
player.installTap(onBus: 0, bufferSize: 1024, format: player.outputFormat(forBus: 0)) { (buffer, when) in
print(buffer.floatChannelData![0])
}
floatChannelData
是一个指向数据的指针,但如何访问实际值?
通过取消引用 floatChannelData 指针来使用它,然后访问各个样本。
player.installTap(onBus: 0, bufferSize: 1024, format: player.outputFormat(forBus: 0)) { (buffer, when) in
let floatData = buffer.floatChannelData![0]
let frameCount = Int(buffer.frameLength)
// Calculate the RMS volume level
var rms: Float = 0.0
for i in 0..<frameCount {
let sample = floatData[i]
rms += sample * sample
}
rms = sqrt(rms / Float(frameCount))
// Now, 'rms' contains the RMS volume level in real-time
print(rms)
}
代码会迭代,进行数学计算以给出一小段时间的 RMS。为了随着时间的推移获得更平滑的 RMS,请累积并进行移动平均。