AVAudioPlayer затухает громкость - PullRequest
47 голосов
/ 01 августа 2009

У меня есть AVAudioPlayer, воспроизводящий звук (дух!)

Звук запускается, когда пользователь нажимает кнопку. Когда они выпустят его, я хочу, чтобы звук исчез.

Я использую Интерфейсный конструктор ... поэтому я пытаюсь подключить функцию «подправить изнутри», которая затухает через 1 секунду, а затем останавливается.

Есть идеи?

Спасибо

Ответы [ 13 ]

1 голос
/ 22 августа 2016

Swift решение:

Ответ с наивысшим рейтингом здесь великолепен, но он дает эффект заикания, так как шаг громкости 0.1 слишком велик. Использование 0,01 дает более плавный эффект затухания, чтобы слышать.

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

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)
}

Вы можете настроить время, используя fadeTime константу.

1 голос
/ 03 августа 2009

Как насчет этого: (если время прошло отрицательно, звук исчезает, в противном случае исчезает)

- (void) fadeInOutVolumeOverTime: (NSNumber *)time
{
#define fade_out_steps  0.1
    float           theVolume = player.volume;
    NSTimeInterval  theTime = [time doubleValue];
    int             sign = (theTime >= 0) ? 1 : -1;

// before we call this, if we are fading out, we save the volume
// so that we can restore back to that level in the fade in
    if ((sign == 1) &&
            ((theVolume >= savedVolume) ||
                            (theTime == 0))) {
        player.volume = savedVolume;
    }
    else if ((sign == -1) && (theVolume <= 0)) {
        NSLog(@"fading");
        [player pause];
        [self performSelector:@selector(fadeInOutVolumeOverTime:) withObject:[NSNumber numberWithDouble:0] afterDelay:1.0];

    }
    else {
        theTime *= fade_out_steps;
        player.volume = theVolume + fade_out_steps * sign;
        [self performSelector:@selector(fadeInOutVolumeOverTime:) withObject:time afterDelay:fabs(theTime)];
    }
}
0 голосов
/ 01 марта 2019

Очень хорошее решение этой проблемы доступно от Ника Локвуда по адресу objc.io. Он использует Core Animation для измерения времени изменения громкости, что может пригодиться, если необходимо синхронизировать анимацию пользовательского интерфейса с изменениями громкости звука, включая интерактивные анимации.

...