提问人:Чайка 提问时间:10/16/2023 更新时间:10/16/2023 访问量:34
我想使用 Swift 在 CoreAudio 中实现音量电平表
I want to implement a volume level meter in CoreAudio using Swift
问:
我已经研究过使用 in ,但是我怎样才能实时获得音量级别?installTap
AVAudioNode
installTap
player.installTap(onBus: 0, bufferSize: 1024, format: player.outputFormat(forBus: 0)) { (buffer, when) in
print(buffer.floatChannelData![0])
}
floatChannelData
是指向数据的指针,但如何获取真正的价值?
答:
1赞
DrJay
10/16/2023
#1
使用 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,累加并做移动平均线。
评论
1赞
sbooth
10/17/2023
使用起来可能更有效率vDSP_rmsqv(floatData, vDSP_Stride(1), &rms, vDSP_Length(frameCount))
评论