AVAudioPlayer fade volume out

前端 未结 13 2060
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-12 12:07

I have an AVAudioPlayer playing some audio (duh!)

The audio is initiated when the user presses a button. When they release it I want the audio to fade out.

I

13条回答
  •  粉色の甜心
    2020-12-12 12:19

    Swift solution:

    The top rated answer here is great but it gives a stuttering effect as the volume step of 0.1 is too much. Using 0.01 gives a smoother fade effect to hear.

    Using this code you can specify how long you want the fade transition to last.

    let fadeVolumeStep: Float = 0.01
    
    let fadeTime = 0.5 // Fade time in seconds
    
    var fadeVolumeStepTime: Double {
         return fadeTime / Double(1.0 / fadeVolumeStep)
    }
    
    func fadeOut() {
        guard let player = self.player else {
            return
        }
    
        if !player.playing { return }
    
        func fadeOutPlayer() {
            if player.volume > fadeVolumeStep {
                player.volume -= fadeVolumeStep
                delay(time: fadeVolumeStepTime, closure: {
                    fadeOutPlayer()
                })
            } else {
                player.stop()
                player.currentTime = 0
                player.prepareToPlay()
            }
        }
    
        fadeOutPlayer()
    }
    
    func fadeIn() {
        guard let player = self.player else {
            return
        }
    
        if player.playing { return }
        player.volume = 0
        player.play()
    
        func fadeInPlayer() {
            if player.volume <= 1 - fadeVolumeStep {
                player.volume += fadeVolumeStep
                delay(time: fadeVolumeStepTime, closure: {
                    fadeInPlayer()
                })
            } else {
                player.volume = 1
            }
        }
    
        fadeInPlayer()
    }
    
    func delay(time delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }
    

    you can adjust the time using fadeTime constant.

提交回复
热议问题