Search code examples
iphoneiosavfoundationavplayeruiprogressview

Timeline Progress bar for AVPlayer


AVPlayer is fully customizable, unfortunately there are convenient methods in AVPlayer for showing the time line progress bar.

AVPlayer *player = [AVPlayer playerWithURL:URL];
AVPlayerLayer *playerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];[self.view.layer addSubLayer:playerLayer];

I have an progress bar that indicates the how video has been played, and how much remained just as like MPMoviePlayer.

So how to get the timeline of video from AVPlayer and how to update the progress bar

Suggest me.


Solution

  • Please use the below code which is from apple example code "AVPlayerDemo".

        double interval = .1f;  
    
        CMTime playerDuration = [self playerItemDuration]; // return player duration.
        if (CMTIME_IS_INVALID(playerDuration)) 
        {
            return;
        } 
        double duration = CMTimeGetSeconds(playerDuration);
        if (isfinite(duration))
        {
            CGFloat width = CGRectGetWidth([yourSlider bounds]);
            interval = 0.5f * duration / width;
        }
    
        /* Update the scrubber during normal playback. */
        timeObserver = [[player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(interval, NSEC_PER_SEC) 
                                                              queue:NULL 
                                                         usingBlock:
                                                          ^(CMTime time) 
                                                          {
                                                              [self syncScrubber];
                                                          }] retain];
    
    
    - (CMTime)playerItemDuration
    {
        AVPlayerItem *thePlayerItem = [player currentItem];
        if (thePlayerItem.status == AVPlayerItemStatusReadyToPlay)
        {        
    
            return([playerItem duration]);
        }
    
        return(kCMTimeInvalid);
    }
    

    And in syncScrubber method update the UISlider or UIProgressBar value.

    - (void)syncScrubber
    {
        CMTime playerDuration = [self playerItemDuration];
        if (CMTIME_IS_INVALID(playerDuration)) 
        {
            yourSlider.minimumValue = 0.0;
            return;
        } 
    
        double duration = CMTimeGetSeconds(playerDuration);
        if (isfinite(duration) && (duration > 0))
        {
            float minValue = [ yourSlider minimumValue];
            float maxValue = [ yourSlider maximumValue];
            double time = CMTimeGetSeconds([player currentTime]);
            [yourSlider setValue:(maxValue - minValue) * time / duration + minValue];
        }
    }