【问题标题】:Swift AVAudioEngine AVAudioPCMBuffer to PowerLevelSwift AVAudioEngine AVAudioPCMBuffer 到 PowerLevel
【发布时间】:2017-11-01 12:54:04
【问题描述】:

我一直在做一个项目来创建一个显示麦克风功率级别的应用程序。我知道提供平均/峰值功率的 AVAudioRecorder 类,但我希望只能记录某些频段的功率电平。我使用 AudioUnitEQ 类来设置频段,并将其附加到 AVAudioEngine 并开始录制。目前,我一直在使用 installTap 方法来获取 AVAudioPCMBuffer,这是我卡住的地方。有没有办法将其转换为功率级别?另外,我的处理方法可能完全错误吗?

【问题讨论】:

    标签: ios swift avfoundation avaudioengine avaudiopcmbuffer


    【解决方案1】:

    您可以像这段代码一样获得 avg/peek。

    engine.installTap(......) { buffer in 
        guard let data = buffer.floatChannelData?[0] else {
            return
        }
        var dbData = [Float](repeating: 0.0, count: data.count)
        var one: Float = 0.0
        vDSP_vdbcon(&data, 1, &one, &dbData, 1, data.count, 1)
    
        var avgLevel: Float = 0.0
        var peakLevel: Float = 0.0
        vDSP_rmsqv(dbData, 1, &avgLevel, vDSP_Length(buffer.frameLength))
        vDSP_maxmgv(dbData, 1, &peakLevel, vDSP_Length(buffer.frameLength))
    }
    

    【讨论】:

    • 我目前有类似的设置,我的问题是返回的 floatChannelData 是一个指向 Float 的 UnsafeMutablePointer 的指针。我对 C API 的熟悉程度非常低,并且我在 guard let 语句中遇到错误,因为 floatChannelData 首先没有成员。请您详细说明一下吗?
    • 这是我的错。示例代码需要将“first”更改为 [0]。我将更改示例代码。谢谢你发现错误。 :)
    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多