AVAudioPlayer fade volume out

前端 未结 13 2057
爱一瞬间的悲伤
爱一瞬间的悲伤 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:23

    Swift has an AVAudioPlayer method you can use for fading out which was included as of iOS 10.0:

    var audioPlayer = AVAudioPlayer()
    ...
    audioPlayer.setVolume(0, fadeDuration: 3)
    
    0 讨论(0)
  • 2020-12-12 12:23

    I ended up combining some of the answer together and converted it to Swift ending up in this method:

    func fadeVolumeAndPause(){
        if self.player?.volume > 0.1 {
            self.player?.volume = self.player!.volume - 0.1
    
            var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
            dispatch_after(dispatchTime, dispatch_get_main_queue(), {
                self.fadeVolumeAndPause()
            })
    
        } else {
            self.player?.pause()
            self.player?.volume = 1.0
        }
    }
    
    0 讨论(0)
  • 2020-12-12 12:24

    Here's how I'm doing it:

    -(void)doVolumeFade
    {  
        if (self.player.volume > 0.1) {
            self.player.volume = self.player.volume - 0.1;
            [self performSelector:@selector(doVolumeFade) withObject:nil afterDelay:0.1];       
         } else {
            // Stop and get the sound ready for playing again
            [self.player stop];
            self.player.currentTime = 0;
            [self.player prepareToPlay];
            self.player.volume = 1.0;
        }
    }
    

    .

    11 years later: do note that setVolume#fadeDuration now exists!

    0 讨论(0)
  • 2020-12-12 12:28

    A very good solution to this problem is available from Nick Lockwood at objc.io. It leverages Core Animation to time volume changes which can come in handy if one needs to synchronise UI animations with audio volume changes, including interactive animations.

    0 讨论(0)
  • 2020-12-12 12:30

    This seems to me to be a descent use of an NSOperationQueue.

    Hence here is my solution:

    -(void) fadeIn
    {
        if (self.currentPlayer.volume >= 1.0f) return;
        else {
            self.currentPlayer.volume+=0.10;
            __weak typeof (self) weakSelf = self;
            [NSThread sleepForTimeInterval:0.2f];
            [self.fadingQueue addOperationWithBlock:^{
                NSLog(@"fading in %.2f", self.currentPlayer.volume);
                [weakSelf fadeIn];
            }];
        }
    }
    -(void) fadeOut
    {
        if (self.currentPlayer.volume <= 0.0f) return;
        else {
            self.currentPlayer.volume -=0.1;
            __weak typeof (self) weakSelf = self;
            [NSThread sleepForTimeInterval:0.2f];
            [self.fadingQueue addOperationWithBlock:^{
                NSLog(@"fading out %.2f", self.currentPlayer.volume);
                [weakSelf fadeOut];
            }];
        }
    }
    
    0 讨论(0)
  • 2020-12-12 12:30

    In Objective-C try this:

    NSURL *trackURL = [[NSURL alloc]initFileURLWithPath:@"path to audio track"];
    
    // fade duration in seconds
    NSTimeInterval fadeDuration = 0.3;
    
    // duration of the audio track in seconds
    NSTimeInterval audioTrackDuration = 5.0; 
    
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]  initWithContentsOfURL:trackURL error:nil];
    [audioPlayer play];
    
    // first we set the volume to 1 - highest
    [audioPlayer setVolume:1.0]; 
    
    // then to 0 - lowest
    [musicAudioPlayer setVolume:0 fadeDuration:audioTrackDuration - fadeDuration];
    
    0 讨论(0)
提交回复
热议问题