在 iOS 上使用 avaudioengine 会破坏 avplayer

Posted

技术标签:

【中文标题】在 iOS 上使用 avaudioengine 会破坏 avplayer【英文标题】:Using avaudioengine for iOS breaks avplayer 【发布时间】:2020-02-10 13:00:52 【问题描述】:

我在我的应用中尝试同时使用 AVAudioPlayer 和 AVAudioEngine 时遇到问题。我正在使用 AVAudioPlayer 播放远程音频文件和音频直播流。我正在使用 AVAudioEngine 来捕获麦克风的声音并将其转录。但是,每当我使用 AVAudioEngine 并返回播放器时,我都无法播放任何音频,因为 avasset 是空的。我必须重新设置并再次播放。使用麦克风且不干扰音频播放的最佳方法是什么

let audioEngine = AVAudioEngine()
var inputNode: AVAudioInputNode!


// view did load

let audiosession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSession.Category.record, mode: AVAudioSession.Mode.measurement)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
inputNode = audioEngine.inputNode

let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.removeTap(onBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat)  (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
    self.recognitionRequest?.append(buffer)

audioEngine.prepare()
try audioEngine.start()

//viewWillDisappear

self.audioEngine.stop()
self.inputNode.removeTap(onBus: 0)

【问题讨论】:

你就是那个说setCategory(AVAudioSession.Category.record)的人。这意味着没有播放。 【参考方案1】:

FWIW matt 的回复为我解决了这个问题(谢谢!)。与OP有类似的问题。我正在通过 SFSpeechRecognizer 混合转录(需要通过 inputNode 使用录制功能),通过 AVAudioRecorder 录制实际音频,并通过 AVPlayer 播放音频。音频文件(对我来说在 Firestore 中)可以正常播放直到我录制了一个新文件。然后什么都不会播放。有一段时间我认为这与我的存储桶或数据库中的延迟有关——或者在我的函数中混淆了记录和播放状态。

SFSpeechRecognizer 在 AVAudioSession 中使用 AVAudioEngine 实例。不知何故,我的代码掩盖了我的 AVAudioRecorder 也在单独的 AVAudioSession 中运行的事实。 (我应该在同一个会话中运行这些吗?这实际上适用于基本用例吗?)

我的旧代码:

try audioSession.setCategory(.record, mode: .measurement, options: .mixWithOthers)

我的新代码有效:

try audioSession.setCategory(.playAndRecord, mode: .measurement, options: .mixWithOthers)

在哪里...

let audioSession = AVAudioSession.sharedInstance()

为此苦苦挣扎了一段时间,因此请确认以防其他人遇到此问题。

出于某种原因,我认为我可以拆除我的 AVAudioSession 以进行转录,并让 AVPlayer 完成它的工作。我的一部分猜测这仍然是可能的,但我在这条路上尝试了几件事,但没有成功。

【讨论】:

以上是关于在 iOS 上使用 avaudioengine 会破坏 avplayer的主要内容,如果未能解决你的问题,请参考以下文章

使用 Avaudioengine iOS 的低通滤波器 + 采样率转换

使用 AVAudioEngine 进行语音识别会在录制后阻止声音

如何使用连接到 AVAudioEngine 混音器的节点同时播放缓冲区中的多个声音

iOS8 AVAudioEngine如何通过Multipeer Connectivity发送麦克风数据?

使用 AVAudioEngine 重复播放音频文件

在Swift iOS中播放PCM文件