在 WatchOS 上使用 AVAudioEngine 录制时阻止播放

Posted

技术标签:

【中文标题】在 WatchOS 上使用 AVAudioEngine 录制时阻止播放【英文标题】:Preventing playback while recording using AVAudioEngine on WatchOS 【发布时间】:2020-02-19 06:15:22 【问题描述】:

我在 ios 中使用 AVAudioEngine 从麦克风收集 PCM 数据,它工作正常,但是当我尝试将项目移动到 WatchOS 时,我在录制时收到反馈。录音时如何停止扬声器的播放?

var audioEngine = AVAudioEngine()

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)

let input = audioEngine.inputNode
let format = input.inputFormat(forBus: 0)

audioEngine.connect(input, to: audioEngine.mainMixerNode, format: format)

try! audioEngine.start()
let mixer = audioEngine.mainMixerNode

let format = mixer.outputFormat(forBus: 0)
let sampleRate = format.sampleRate
let fft_size = 2048

mixer.installTap(onBus: 0, bufferSize: UInt32(fft_size), format: format, 
            block: (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
    // Processing

【问题讨论】:

【参考方案1】:

对于遇到此问题的其他人,我通过删除从 inputNode 到 mainMixerNode 的连接来修复它,并将分接头直接安装在 inputNode 上。在我猜测之前我这样做的方式会创建一个反馈循环,它正在播放它正在录制的内容。不知道为什么这只发生在 WatchOS 而不是 iPhone 上……也许它是从耳机而不是麦克风旁边的扬声器播放的。固定代码:

var audioEngine = AVAudioEngine()

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)

try! audioEngine.start()
let input = audioEngine.inputNode

let format = mixer.outputFormat(forBus: 0)
let sampleRate = format.sampleRate
let fft_size = 2048

input.installTap(onBus: 0, bufferSize: UInt32(fft_size), format: format, 
            block: (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
    // Processing

【讨论】:

以上是关于在 WatchOS 上使用 AVAudioEngine 录制时阻止播放的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 watchOS 上运行 AudioKit?

在 WatchOS 上启动视图

无法在 watchOS 上使用 GameKit(游戏中心)对本地玩家进行身份验证

在 WatchOS 上移动到不同的屏幕

如何在 watchOS 3 复杂功能上斜体显示文本?

如何在 watchOS WKInterfaceMap 上绘制折线?