Swift AVAudioEngine - 如何使本地麦克风静音

Posted

技术标签:

【中文标题】Swift AVAudioEngine - 如何使本地麦克风静音【英文标题】:Swift AVAudioEngine - How to mute local mic 【发布时间】:2021-12-02 16:56:52 【问题描述】:

我正在使用AVAudioEngine 获取本地麦克风输入,然后进行广播。我想在点击静音按钮时停止获取本地麦克风输入。

我尝试了三件事:

    audioEngine.inputNode.isVoiceProcessingInputMuted = true - 没用。 audioEngine.stop() - 实际上它可以工作,但会导致其他问题:我正在使用 HaishinKit 流式传输屏幕录制 + 麦克风输入 + 其他设备音频。停止 audioEngine 会导致查看器端出现小延迟。 使用HaishinKit.RTMPStream 静音:rtmpStream.audiosettings[.muted] = true - 它可以工作,但会静音整个音频。我只想将本地麦克风静音,而不是其他设备的音频。

//

private func startTappingMicrophone() 
    let inputNode = audioEngine.inputNode
    let inputFormat = inputNode.outputFormat(forBus: 0)
    audioEngine.inputNode.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize), format: inputFormat)  [weak self] buffer, _ in
          guard let self = self else  return 
          self.conversionQueue.async 
            if let cmSampleBuffer = self.configureSampleBuffer(pcmBuffer: buffer) 
              self.delegate?.recievedRecordedFrame(cmSampleBuffer)
            
          
    
    audioEngine.prepare()
    try? audioEngine.start()

【问题讨论】:

【参考方案1】:

根据您的设置,简单地不向委托发送缓冲区可能会有所帮助。

但是无论哪种方式都可以将缓冲区归零:

if let floatChannelData = buffer.floatChannelData 
    for c in 0..<Int(buffer.format.channelCount) 
        memset(floatChannelData[c], 0, MemoryLayout<Float>.size * Int(buffer.frameLength))
    

【讨论】:

它会工作,但我只想静音麦克风而不是其他设备音频。 @LevanKaranadze 在我的情况下audioEngine.inputNode 只产生麦克风音频,你的情况有什么不同吗?但是还有什么其他音频? 在 configureSampleBuffer 中,我将麦克风输入与其他设备音频相结合。我猜我必须修改这个函数。我是按照这个git做的:gist.github.com/aibo-cora/c57d1a4125e145e586ecb61ebecff47c

以上是关于Swift AVAudioEngine - 如何使本地麦克风静音的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioEngine MIDI 文件播放(当前进度+MIDI 结束回调)Swift

使用 Swift 使用 AVAudioEngine 实时进行音高转换

在 Swift 中使用 AVAudioEngine 点击麦克风输入

swift AVAudioEngine 和 AVAudioSinkNode sampleRate 转换

Swift AVAudioEngine:更改MacOS的音频输入设备

使用 AVAudioEngine 的实时音频