在 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 混音器的节点同时播放缓冲区中的多个声音