AVPlayer - Fast Backward / Forward Stream

后端 未结 4 1487
生来不讨喜
生来不讨喜 2021-01-14 00:08

This is my code in the viewDidLoad :

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@\"http://groove.wavestreamer.com:7321/l         


        
相关标签:
4条回答
  • 2021-01-14 00:21

    Use AVPlayer method seekToTime

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

    here is a reference

    Hope it helps

    0 讨论(0)
  • 2021-01-14 00:33

    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

    0 讨论(0)
  • 2021-01-14 00:40

    Swift 4, 4.2 & 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 讨论(0)
  • 2021-01-14 00:46

    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;
    }
    
    0 讨论(0)
提交回复
热议问题