#ios #swift #arkit #audio-player #scnaudioplayer
#iOS #swift #arkit #аудиоплеер #scnaudioplayer
Вопрос:
Я пытаюсь реализовать кнопку воспроизведения / паузы для позиционного звука, подключенного к узлу в сцене ARKit. Я хочу, чтобы пользователь мог приостановить воспроизведение звука, а затем возобновить его с момента приостановки позже. Это removeAudioPlayer()
бесполезно, так как при повторном подключении звук возвращается к началу.
Единственный метод паузы, связанный со SCNAudioPlayers, который я могу найти, похоронен глубоко внутри:
myAudioPlayer.audioNode?.engine?.pause()
Но это, похоже, не имеет никакого эффекта. Странно
myAudioPlayer.audioNode?.engine?.stop()
Останавливает воспроизведение звука, но после этого вы не сможете запустить его снова!
Мой код для создания аудиоплеера выглядит следующим образом:
audioSource = SCNAudioSource(fileNamed: "audio.caf")!
audioSource.loops = false
audioSource.isPositional = true
audioSource.shouldStream = false
audioSource.load()
// then a bit later...
audioPlayer = SCNAudioPlayer(source: audioSource)
myARNode.addAudioPlayer(audioPlayer)
Обратите внимание, что метод ‘play’ не требуется. Звук начинает воспроизводиться, как только вы подключаете его к узлу. И отсутствие методов прямого воспроизведения () и паузы () в качестве свойств верхнего уровня SCNAudioPlayer заставляет меня задуматься, возможно ли это вообще. Однако это кажется немного сумасшедшим, поскольку это довольно элементарный аспект работы со звуком.
Кто-нибудь знает, можно ли это сделать?
Заранее спасибо.
Ответ №1:
Чтобы остановить звуковой движок, используйте 2-секундную задержку. Пауза здесь не работает (я использую Xcode 12.2).
DispatchQueue.main.asyncAfter(deadline: .now() 2.0) {
player.audioNode?.engine?.stop()
}
Комментарии:
1. Похоже, у этого есть те же проблемы, что и в приведенных примерах. stop() останавливает звук, но предотвращает его повторный запуск, а pause() ничего не делает. Мне нужна возможность приостановки. Если бы я просто хотел остановить звук, я могу сделать это с помощью removeAudioPlayer()