Затухание AVAudioEngine AVAudioPlayerNode

Я пытаюсь уменьшить размер файла mp3 с помощью AVAudioEngine и AVAudioPlayerNode. Я не могу разобраться. Кто-нибудь может помочь в Swift?

Я уже кое-что пробовал. Все работает неплохо, но не так гладко, как хотелось бы.

    var fadeOutPlayer: Float = playerVolume
            var fadeOutQuinte: Float = playerQuinteVolume
            while fadeOutPlayer > 0.0 {
                player.volume = fadeOutPlayer
                playerQuinte.volume = fadeOutQuinte
                fadeOutPlayer -= 0.001
                fadeOutQuinte -= 0.001
                usleep(100)
            }


Я также попробовал таймер (который не затухает):

if !isTimerFadeOutRunning {
            player.volume = 0
            playerQuinte.volume = 0
            counter = 0
            timerFadeOut = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(runTimerFadeOut), userInfo: nil, repeats: true)
            isTimerFadeOutRunning = true
        }
    }

    @objc func runTimerFadeOut() {
        counter += 0.1
        if counter == 0.2 {
            player.pause()
            playerQuinte.pause()
        }
    }

person Steffen Weber    schedule 04.11.2019    source источник


Ответы (1)


Я прикрепил AVAudioUnitEQ к своему потоку перед mainMixerNode, а затем контролировал globalGain. Следующий код демонстрирует идею:

private func manageFadeOut(volume: Double, fadeOutSecs: Double) {
    let timeSecs = 0.001
    DispatchQueue.main.asyncAfter(deadline: .now() + timeSecs) {
        if !self.isFadingOut { return }
        for fx in self.fadeOutEffects { fx.globalGain = Float(-96 * (1.0 - volume)) }
        if volume <= 0 {
            for player in self.players { player.stop() }
            self.isFadingOut = false
            return
        }
        let fade = timeSecs / fadeOutSecs
        self.manageFadeOut(volume: volume - fade, fadeOutSecs: fadeOutSecs)
    }
}
person Ráfagan    schedule 21.09.2020