我想使用 Swift 在 CoreAudio 中实现音量电平表

I want to implement a volume level meter in CoreAudio using Swift

提问人:Чайка 提问时间:10/16/2023 更新时间:10/16/2023 访问量:34

问:

我已经研究过使用 in ,但是我怎样才能实时获得音量级别?installTapAVAudioNodeinstallTap

player.installTap(onBus: 0, bufferSize: 1024, format: player.outputFormat(forBus: 0)) { (buffer, when) in
    print(buffer.floatChannelData![0])
}

floatChannelData是指向数据的指针,但如何获取真正的价值?

Swift 核心音频

评论


答:

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))