Ошибки AVFoundation, нет звука, когда я запускаю AudioPlayer.play()

#swift #xcode #audio #avfoundation

Вопрос:

У меня небольшая проблема с AVFoundation, когда я запускаю звук, ничего не выходит. С другой стороны, достаточно добавить таймер, который отображает текущее время рассматриваемого звука, и все работает правильно. не могли бы вы мне помочь? Спасибо.

код, который не работает:

                      do {
                        let path = Bundle.main.path(forResource: "sound1", ofType: "mp3")!
                        let url = URL(fileURLWithPath: path)

                        let audioPlayer = try AVAudioPlayer(contentsOf: url)
                        
                        audioPlayer.volume = 1.0
                        audioPlayer.play()
                        
                    } catch {
                        assertionFailure("Failed crating audio player: (error).")
                        return
                    }

 

просто добавьте таймер, и все будет работать:

                     do {
                        let path = Bundle.main.path(forResource: "sound1", ofType: "mp3")!
                        let url = URL(fileURLWithPath: path)

                        let audioPlayer = try AVAudioPlayer(contentsOf: url)
                        
                        audioPlayer.volume = 1.0
                        audioPlayer.play()
                        print("le son est en cours de lecture !")
                        
                        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
                            print(audioPlayer.currentTime)
                        }
                        
                    } catch {
                        assertionFailure("Failed crating audio player: (error).")
                        return
                    }
 

Комментарии:

1. Загрузите аудиофайл в память перед воспроизведением звука.

2. Как я могу это сделать ?

3. и почему это работает, когда я добавляю таймер ? обычно это не должно меняться

4. Я только что попробовал использовать метод prepareForPlay (), но он все еще не работает

5. ваш AVAudioPlayer выходит за рамки и разрушается. назначьте его переменной-члену, чтобы продлить срок его службы. это то, что ваш таймер, по сути, делает во втором примере кода

Ответ №1:

Это сработало для меня

вместо

let audioPlayer = try AVAudioPlayer(contentsOf: url)

изменить на

audioPlayer = try AVAudioPlayer(contentsOf: url)