ios - 在 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)
解决方案
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 来做它的事情。我的一部分猜测这仍然是可能的,但我在这条路上尝试了几件事,但没有成功。
推荐阅读
- typescript - 扩展 Typescript 接口时推断泛型参数
- sql - 删除约束 - 关系不存在
- python - 如何从电子邮件正文中获取链接 - Selenium
- javascript - 在 React 中单击来自不同组件的按钮时触发另一个组件中的函数
- http - 当请求 HTML 页面的资源时会打开新的 TCP 连接吗?
- html - XSLT 合并具有相同值的行
- flutter - Flutter Blocs 快速事件导致数据丢失
- windows - 如何检查图像是否具有 Alpha 通道
- javascript - 谷歌图表从数组中添加行
- json - Xcode - 将字符串解析为可用的数据结构