AVPlayer - fast reverse / forward flow

This is my code in 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 is:
How can I create a button that is fast, forward / backward, backward 5 seconds when it is pressed?

Thank you for your responses...:)

EDIT: How to add to my current time ...

 CMTime currentTime = music.currentTime; 

... 5 seconds?

+3
source share
4 answers

Use the AVPlayer seekToTime method

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

here reference

Hope this helps

+1
source

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; } 
+8
source

You can use avPlayer.rate to quickly go back / forward

Prices: 1.0 0.0 pause

But first you have to check if avPlayerItem can do one of the actions

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

+1
source

Swift 4, 4,2 and 5

 var player : AVPlayer! @IBAction func fastForwardBtn(_ sender: UIButton) { let moveForword : Float64 = 5 if player == nil { return } if let duration = player!.currentItem?.duration { let playerCurrentTime = CMTimeGetSeconds(player!.currentTime()) let newTime = playerCurrentTime + moveForword if newTime < CMTimeGetSeconds(duration) { let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000) player!.seek(to: selectedTime) } player?.pause() player?.play() } } @IBAction func rewindBtn(_ sender: UIButton) { let moveBackword: Float64 = 5 if player == nil { return } let playerCurrenTime = CMTimeGetSeconds(player!.currentTime()) var newTime = playerCurrenTime - moveBackword if newTime < 0 { newTime = 0 } player?.pause() let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000) player?.seek(to: selectedTime) player?.play() } 
0
source

All Articles