获取video的当前时间(玩家 – Swift)

我使用播放器 (使用AVFoundation)设置了一个video播放器 。 我试图访问和操作video的currentTime,但是,图书馆只提供video的持续时间,而不是currentTime。

我正在调整播放器的演示项目 。


请检查下面的“更新”部分,而不是在这里:

一个朋友告诉我,我可以用这种方法来实现,但是在这种情况下,我实际上无法调整这个方法。

[NSTimer scheduledTimerWithInterval:1.0 target:self selector:@selector(refreshCurrentTimeTextField) userInfo:nil repeats:YES] -(void)refreshCurrentTimeTextField { NSTimeInterval currentTime; QTMovie *movie = [movieView movie]; QTGetTimeInterval([movie currentTime], &currentTime); int hours = currentTime/3600; int minutes = (currentTime/60) % 60; int seconds = currentTime % 60; NSString *timeLabel; if(hours > 0) { timeLabel = [NSString stringWithFormat:@"%02i:%02i:%02i", hours, minutes, seconds]; } else { timeLabel = [NSString stringWithFormat:@"%02i:%02i", minutes, seconds]; } [yourTextField setStringValue:timeLabel]; } 

如果你们中有人使用或偶然发现了这个库,有什么方法可以获得currentTime? 有没有其他的方式来访问/操作video的当前时间?


更新:

有人显然给了在这里为等效库PBJVideoPlayer的 Objective-C的导入和连接UISlider的代码。 但是我不能在Swift上适应播放器。

链接片段:

 diff --git a/Pods/PBJVideoPlayer/Source/PBJVideoPlayerController.mb/Pods/PBJVideoPlayer/Source/PBJVideoPlayerController.m index be6a7d1..51a420e 100644 --- a/Pods/PBJVideoPlayer/Source/PBJVideoPlayerController.m +++ b/Pods/PBJVideoPlayer/Source/PBJVideoPlayerController.m @@ -81,6 +81,8 @@ static NSString * const PBJVideoPlayerControllerReadyForDisplay = @"readyForDisp float _volume; } +@property (nonatomic, strong) UISlider *slider; + @end @implementation PBJVideoPlayerController @@ -93,6 +95,16 @@ static NSString * const PBJVideoPlayerControllerReadyForDisplay = @"readyForDisp #pragma mark - getters/setters +- (UISlider *)slider { + if (_slider == nil) { + _slider = [[UISlider alloc] initWithFrame:CGRectZero]; + _slider.minimumValue = 0.0; + _slider.maximumValue = 0.0; + _slider.continuous = YES; + } + return _slider; +} + - (void)setVideoFillMode:(NSString *)videoFillMode { if (_videoFillMode != videoFillMode) { @@ -311,6 +323,59 @@ static NSString * const PBJVideoPlayerControllerReadyForDisplay = @"readyForDisp NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(_applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; [nc addObserver:self selector:@selector(_applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; + + self.slider.hidden = YES; + [self.slider addTarget:self action:@selector(moveScrubber:) forControlEvents:UIControlEventValueChanged]; + [self.view addSubview:self.slider]; + + __weak typeof(self) weak = self; + CMTime intervalSeconds = CMTimeMakeWithSeconds(0.25f, NSEC_PER_SEC); + [_player addPeriodicTimeObserverForInterval:intervalSeconds + queue:dispatch_get_main_queue() + usingBlock:^(CMTime time) { + [weak syncScrubber]; + }]; +} + +- (void)syncScrubber +{ + CMTime duration = _player.currentItem.duration; + if (CMTIME_IS_INVALID(duration)) { + self.slider.maximumValue = 0.0; + } else { + Float64 seconds = CMTimeGetSeconds(duration); + if (isfinite(seconds)) { + self.slider.maximumValue = seconds; + Float64 current = CMTimeGetSeconds([_player currentTime]); + self.slider.value = current; + } + } +} + +- (void)moveScrubber:(UISlider *)slider +{ + CMTime duration = _player.currentItem.duration; + if (CMTIME_IS_INVALID(duration)) { + self.slider.maximumValue = 0.0; + } else { + Float64 seconds = CMTimeGetSeconds(duration); + if (isfinite(seconds)) { + self.slider.maximumValue = seconds; + [_player seekToTime:CMTimeMakeWithSeconds(slider.value, NSEC_PER_SEC)]; + } + } +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + CGRect sliderRect = self.view.frame; + sliderRect.origin.y = sliderRect.size.height - 40; + sliderRect.size.height = 40; + sliderRect.origin.x = self.view.frame.size.width/4.0; + sliderRect.size.width = self.view.frame.size.width/2.0; + self.slider.frame = sliderRect; } - (void)viewDidDisappear:(BOOL)animated @@ -402,11 +467,13 @@ typedef void (^PBJVideoPlayerBlock)(); case PBJVideoPlayerPlaybackStateStopped: { [self playFromBeginning]; + self.slider.hidden = YES; break; } case PBJVideoPlayerPlaybackStatePaused: { [self playFromCurrentTime]; + self.slider.hidden = YES; break; } case PBJVideoPlayerPlaybackStatePlaying: @@ -414,6 +481,7 @@ typedef void (^PBJVideoPlayerBlock)(); default: { [self pause]; + self.slider.hidden = NO; break; } } @@ -511,6 +579,14 @@ typedef void (^PBJVideoPlayerBlock)(); _videoView.playerLayer.backgroundColor = [[UIColor blackColor] CGColor]; [_videoView.playerLayer setPlayer:_player]; _videoView.playerLayer.hidden = NO; + + CMTime duration = _playerItem.duration; + if (CMTIME_IS_INVALID(duration)) { + self.slider.maximumValue = 0.0; + } else { + Float64 seconds = CMTimeGetSeconds(duration); + self.slider.maximumValue = seconds; + } break; } case AVPlayerStatusFailed: 

我只是运行你的GitHub项目,我通过下面的代码修复它:

在你的Player.swift类。

  player.addPeriodicTimeObserverForInterval(CMTimeMake(1, 100), queue: dispatch_get_main_queue()) { [unowned self] time in let timeString = String(format: "%02.2f", CMTimeGetSeconds(time)) print("time is \(timeString)") self.delegate?.playerPlaybackstimer(timeString) } 

上面的方法在public convenience init() {添加public convenience init() {函数,使得看起来像:

  public convenience init() { self.init(nibName: nil, bundle: nil) self.player = AVPlayer() self.player.actionAtItemEnd = .Pause self.player.addObserver(self, forKeyPath: PlayerRateKey, options: ([NSKeyValueObservingOptions.New, NSKeyValueObservingOptions.Old]) , context: &PlayerObserverContext) self.playbackLoops = false self.playbackFreezesAtEnd = false self.playbackState = .Stopped self.bufferingState = .Unknown player.addPeriodicTimeObserverForInterval(CMTimeMake(1, 100), queue: dispatch_get_main_queue()) { [unowned self] time in let timeString = String(format: "%02.2f", CMTimeGetSeconds(time)) print("time is \(timeString)") self.delegate?.playerPlaybackstimer(timeString) } } 

之后,我在public protocol PlayerDelegate: class创build一个委托方法public protocol PlayerDelegate: class将如下所示:

 public protocol PlayerDelegate: class { func playerReady(player: Player) func playerPlaybackStateDidChange(player: Player) func playerBufferingStateDidChange(player: Player) func playerPlaybackWillStartFromBeginning(player: Player) func playerPlaybackDidEnd(player: Player) func playerPlaybackstimer(NSString: String) } 

现在进入你的ViewController.swift类并添加以下函数:

 func playerPlaybackstimer(NSString: String) { print("currunt time \(NSString)") } 

现在运行你的项目,享受。