AVPlayer – Fast Backward / Forward Stream

This is my code in the viewDidLoad :

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://groove.wavestreamer.com:7321/listen.pls?sid=1"]];

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];

music = [[AVPlayer playerWithPlayerItem:playerItem] retain];
[music play];

My question:
How can I create a button, that fast-forwards / fast-backwards the stream 5 seconds, when it´s pressed?

  • AVPlayerItem fails with AVStatusFailed and error code “Cannot Decode”
  • AVPlayer crash when resizing window during fullscreen while hotspotting
  • ios avplayer trigger streaming is out of buffer
  • How to perform some action on Play and Pause actions of AVPlayer?
  • Playing video from within app?
  • AVPlayer Duration is NAN with Twilio
  • Thank you for your answers… 🙂

    EDIT: How can I add to my current time…

    CMTime currentTime = music.currentTime;
    

    …the 5 seconds?

    3 Solutions Collect From Internet About “AVPlayer – Fast Backward / Forward Stream”

    Use AVPlayer method seekToTime

    AVPlayer *player=..;
     [player seekToTime:time toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
    

    here is a reference

    Hope it helps

    In Swift,

    fileprivate let seekDuration: Float64 = 5
    
    
    @IBAction func doForwardJump(_ sender: Any) {
        guard let duration  = player.currentItem?.duration else{
            return
        }
        let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
        let newTime = playerCurrentTime + seekDuration
    
        if newTime < CMTimeGetSeconds(duration) {
    
            let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
            player.seek(to: time2)
        }
    }
    @IBAction func doBackwardJump(_ sender: Any) {
    
        let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
        var newTime = playerCurrentTime - seekDuration
    
        if newTime < 0 {
            newTime = 0
        }
        let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
        player.seek(to: time2)
    
    }
    

    In Objective-C,

    #define seekDuration (float)5
    
    - (IBAction)backwardButtonAction:(UIButton *)sender {
        float playerCurrentTime = [self getCurrentTime];
        float newTime = playerCurrentTime - seekDuration;
    
        if (newTime < 0) {
            newTime = 0;
        }
        CMTime time = CMTimeMake(newTime*1000, 1000);
        [self.player seekToTime:time completionHandler:^(BOOL finished) {
            dispatch_async(dispatch_get_main_queue(), ^{
                playerSliderisScrubbing = NO;
            });
        }];
    }
    - (IBAction)forwardButtonAction:(UIButton *)sender {
        float duration = [self getPlayerDuration];
        float playerCurrentTime = [self getCurrentTime];
        float newTime = playerCurrentTime + seekDuration;
    
        if (newTime < duration) {
            CMTime time = CMTimeMake(newTime*1000, 1000);
            [self.player seekToTime:time completionHandler:^(BOOL finished) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    playerSliderisScrubbing = NO;
                });
            }];
    
        }
    }
    - (float)getCurrentTime {
        float seconds = 0;
        if (_player) {
            seconds = CMTimeGetSeconds([_player currentTime]);
        }
        return seconds;
    }
    - (float)getPlayerDuration {
        float seconds = 0;
        if (_player) {
            seconds = CMTimeGetSeconds([[_player currentItem] duration]);
        }
        return seconds;
    }
    

    You can use avPlayer.rate to fast backward/forward

    Rates: 1.0 normal
    0.0 pause

    But first, you should check if avPlayerItem can do one of your action

    For more info: https://developer.apple.com/LIBRARY/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html#//apple_ref/occ/instp/AVPlayer/rate