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

标签 swift audio buffer avaudioplayer

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

所以我想问,在将输入流式传输到其他设备之前,我如何查看输入的音量。

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

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

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

谢谢!

最佳答案

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

            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 .

关于Swift - 如何从麦克风输入(AVAudioPCMBuffer)获取当前音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265962/

相关文章:

android - 更改BroadcastReceiver中用于通知非流媒体首选项的输出音量

tcp - WSASend() 是否隐藏了大缓冲区的批处理?

c - 缓冲区溢出或其他

ios - swift:使用restkit输出json

c# - 如何枚举为应用程序注册的声音?

ios - 摇晃播放我的阵列列表中的随机歌曲时出现异常

c++ - 大整数被误读/误写入二进制文件

ios - 检查查询键是否为 nil Parse

swift - swiftUI 中的可识别协议(protocol)...id 属性...var vs let

swift - 将 PromiseKit 转换为 Signal 和 SignalProducer