首页 > 解决方案 > 在 iOS 上使用 avaudioengine 会破坏 avplayer

问题描述

我在我的应用程序中尝试同时使用 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)

标签: iosswiftavplayeravaudioengine

解决方案


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 来做它的事情。我的一部分猜测这仍然是可能的,但我在这条路上尝试了几件事,但没有成功。


推荐阅读