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

时间:2017-04-06 21:20:01

标签: swift audio buffer avaudioplayer

我正在从麦克风录制音频并将该音频流式传输到另一台设备。目前,即使用户不说话,也会在流中发送此音频。但是我注意到很多流媒体服务实际上并没有发送你的麦克风输入,因为它们发现它的声音非常小。

所以我问,在将数据流传输到其他设备之前,我怎么看输入有多大。

我正在使用附加到AVAudioEngine的AVAudioPlayerNode录制音频。然后我使用以下内容实际记录:

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

这里,buffer是一个AVAudioPCMBuffer,所以我需要能够从这个缓冲区中看到音量。

谢谢!

1 个答案:

答案 0 :(得分:1)

我能够使用以下代码完成此操作:

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

此答案归功于此question