AVAudioPlayer воспроизводит звук в зависимости от того, где я создаю экземпляр AVAudioPlayer - PullRequest
0 голосов
/ 23 мая 2018

У меня есть класс с AVAudioPlayer свойством.Я установил URL для звукового файла одним методом (скажем, Func A), создал экземпляр AVAudioPlayer и воспроизвел звук другим методом (скажем, Func B).Звук воспроизводится нормально.

Однако, если я создаю AVAudioPlayer в Func A, где я задаю URL для звукового файла и просто воспроизводю звук в Func B, звук воспроизводится с перебоями.

Звук - это звуковой эффект, который воспроизводится при каждом нажатии кнопки.Кнопку можно нажимать несколько раз, и звуковой эффект должен воспроизводиться повторно.

Я попытался настроить (и активировать) сеанс аудио для приложения, в application(_:didFinishLaunchingWithOptions:) в моем классе AppDelegate, хотя это не помогло.кажется, помогает.

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

Кроме того, для звуковых эффектов, которые воспроизводятся повторно, есть ли какая-то польза взвонить prepareToPlay каждый раз, когда я хочу воспроизвести звук?

Подход A (звук воспроизводится с перерывами):

import AVFoundation
...
class myClass: UIViewController, SCNSceneRendererDelegate
{
    var audioPlayer: AVAudioPlayer!
    var sound: URL?
    let soundFile: String
    ...
    func LoadSound() {
        sound = Bundle.main.url(forResource: soundFile, withExtension: "mp3")

        if let _sound = sound {
            do {
                try audioPlayer = AVAudioPlayer(contentsOf: _sound)
            catch {
                ...
            }
        } else {
            ...
        }
    } // end of func LoadSound
    ...
    func playSoundFX() {
        audioPlayer.play()
    }
    ...
}

Подход B (звук воспроизводится нормально):

import AVFoundation
...
class myClass: UIViewController, SCNSceneRendererDelegate
{
    var audioPlayer: AVAudioPlayer!
    var sound: URL?
    let soundFile: String
    ...
    func LoadSound() {
        sound = Bundle.main.url(forResource: soundFile, withExtension: "mp3")
    }
    ...
    func playSoundFX() {
        if let _sound = sound {
            do {
                try audioPlayer = AVAudioPlayer(contentsOf: _sound)
                audioPlayer.play()
            catch {
                ...
            }
        } else {
            ...
        }
    }
    ...
}
...