Swift - 如何从麦克风输入(AVAudioPCMBuffer)获取当前音量
Swift - How to get the current volume from the microphone input (AVAudioPCMBuffer)
我正在从麦克风录制音频并将该音频流式传输到另一台设备。目前,即使用户没有说话,此音频也会通过流发送。但我注意到很多流媒体服务在检测到来自麦克风的噪音很小时实际上并没有发送你的麦克风输入。
所以我想问,在将输入流式传输到其他设备之前,我如何查看输入的音量。
我正在使用附加到 AVAudioEngine 的 AVAudioPlayerNode 录制音频。然后我使用以下内容实际记录:
localInput?.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) {
(buffer, when) -> Void in
这里,buffer是一个AVAudioPCMBuffer,所以我需要能够从这个buffer中看到音量。
谢谢!
我能够使用以下代码完成此操作:
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)
}
此答案归功于此 。
我正在从麦克风录制音频并将该音频流式传输到另一台设备。目前,即使用户没有说话,此音频也会通过流发送。但我注意到很多流媒体服务在检测到来自麦克风的噪音很小时实际上并没有发送你的麦克风输入。
所以我想问,在将输入流式传输到其他设备之前,我如何查看输入的音量。
我正在使用附加到 AVAudioEngine 的 AVAudioPlayerNode 录制音频。然后我使用以下内容实际记录:
localInput?.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) {
(buffer, when) -> Void in
这里,buffer是一个AVAudioPCMBuffer,所以我需要能够从这个buffer中看到音量。
谢谢!
我能够使用以下代码完成此操作:
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)
}
此答案归功于此