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

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

我尝试了三件事:

  1. audioEngine.inputNode.isVoiceProcessingInputMuted = true - 没用。
  2. audioEngine.stop() - 实际上它可以工作,但会导致其他问题:我正在使用 HaishinKit 流式传输屏幕录制 + 麦克风输入 + 其他设备音频。停止 audioEngine 会导致查看器端出现小延迟。
  3. 使用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()
}

【问题讨论】:

    标签: ios swift streaming


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2017-10-26
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多