audio - 带有位置音频 SCNAudioPlayer 的 ARKit SceneKit ARSCNView 不会停止播放
问题描述
使用 ARSCNView 运行 ARKit 2.0。iOS12 应用程序使用多线程,这就是为什么这些功能在主线程上执行(只是为了确定)。我也尝试过没有在主线程上显式执行功能,但无济于事。
我正在使用 .aiff 声音文件,但也尝试过 .wav。没有喜悦。
我什至尝试从节点层次结构中删除 audioNode_alarm 并且声音仍在播放。我什至从视图层次结构中删除了 ARSCNView 并且声音仍然播放。FFS
据我所知,我正在按照我应该做的事情做,以阻止音频播放。无论我尝试什么,音频都不会停止。谁能想到为什么?!
weak var audioNode_alarm: SCNNode!
weak var audioPlayer_alarm: SCNAudioPlayer?
func setupAudioNode() {
let audioNode_alarm = SCNNode()
addChildNode(audioNode_alarm)
self.audioNode_alarm = audioNode_alarm
}
func playAlarm() {
DispatchQueue.main.async { [unowned self] in
self.audioNode_alarm.removeAllAudioPlayers()
if let audioSource_alarm = SCNAudioSource(fileNamed: "PATH_TO_MY_ALARM_SOUND.aiff") {
audioSource_alarm.loops = true
audioSource_alarm.load()
audioSource_alarm.isPositional = true
let audioPlayer_alarm = SCNAudioPlayer(source: audioSource_alarm)
self.audioNode_alarm.addAudioPlayer(audioPlayer_alarm)
self.audioPlayer_alarm = audioPlayer_alarm
}
}
}
func stopAlarm() {
DispatchQueue.main.async { [unowned self] in
self.audioNode_alarm?.removeAudioPlayer(self.audioPlayer_alarm!)
self.audioNode_alarm?.removeAllAudioPlayers()
}
}
解决方案
我最终做的是停止声音并删除播放器
yourNode.audioPlayers.forEach { audioLocalPlayer in
audioLocalPlayer.audioNode?.engine?.stop()
yourNode.removeAudioPlayer(audioLocalPlayer)
}
根据文档SCNAudioPlayer有audioNode,它应该用于“在播放期间实时改变音量和混响等参数”。
推荐阅读
- sml - SML/NJ 中的过载冲突
- python - 遍历一个 url 列表
- c# - 尽管在当前线程中设置了正确的语言环境,但 C# DateTime.ToString() 在 Linux Ubuntu 18.04 上是错误的
- wordpress - WordPress 登录用户仅使用用户 ID - 登录不记得问题
- material-ui - 在 react-datepicker 中更改日历的背景颜色
- javascript - 有没有办法防止 VSCode 自动格式化在问号和单词之间添加空格
- javascript - Nodejs试图填充用户,但没有成功
- python - 在 Kivy 中添加导航抽屉后,背景图像不会显示
- javascript - Phaser 3 无法加载资产
- python - 为什么 Lagarith 无损视频编解码器 (LAGS) 在 Python 上不起作用?