Swift - 如何从麦克风输入(AVAudioPCMBuffer)中获取当前音量

4
我正在从麦克风录制音频并将其流式传输到另一个设备。目前,即使用户没有说话,这些音频也会通过流发送。但我注意到很多流媒体服务在检测到来自麦克风的噪音非常小的时候,实际上并不会发送您的麦克风输入。

所以我想问,如何在将其流式传输到其他设备之前查看输入的音量大小。
我正在使用连接到AVAudioEngine的AVAudioPlayerNode录制音频。然后我使用以下内容进行实际录制:

localInput?.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) {
    (buffer, when) -> Void in

在这里,缓冲区是一个AVAudioPCMBuffer,因此我需要能够从该缓冲区中查看音量。

谢谢!

1个回答

3
我能使用下面的代码完成这个任务:
            let arraySize = Int(buffer.frameLength)
            var channelSamples: [[DSPComplex]] = []
            let channelCount = Int(buffer.format.channelCount)

            for i in 0..<channelCount {

                channelSamples.append([])
                let firstSample = buffer.format.isInterleaved ? i : i*arraySize

                for j in stride(from: firstSample, to: arraySize, by: buffer.stride*2) {

                    let channels = UnsafeBufferPointer(start: buffer.floatChannelData, count: Int(buffer.format.channelCount))
                    let floats = UnsafeBufferPointer(start: channels[0], count: Int(buffer.frameLength))
                    channelSamples[i].append(DSPComplex(real: floats[j], imag: floats[j+buffer.stride]))

                }
            }

            var spectrum = [Float]()

            for i in 0..<arraySize/2 {

                let imag = channelSamples[0][i].imag
                let real = channelSamples[0][i].real
                let magnitude = sqrt(pow(real,2)+pow(imag,2))

                spectrum.append(magnitude)
            }

感谢此问题的答案。

这个问题涉及到使用加速框架在Swift中生成音频声谱图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接