Как я могу приостановить воспроизведение SCNAudioPlayer в ARKit?

#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()