AVPlayer,播放/暂停状态的通知?

ste*_*ete 34 ios avplayer

我正在寻找一种方法来获得AVPlayer开始播放时的确切时刻.有"费率"属性,但目前我正在定期检查它NSTimer以获取更新.

我试过KVO,但显然它不符合KVO标准.

我知道,有事件,当玩家ENDED.但我在这里谈论暂停.

我也KVO订阅了AVPlayerItem's"状态",但是当HTTP资产完成缓存,没有播放/暂停时它会显示我.我也开始收集播放/暂停的所有调用,之后请求即时UI更新,但在AVPlayer真正开始播放之前需要更多的runloops .我只是想立刻更新我的按钮.

rai*_*xer 47

为什么你说"费率"不是KVO投诉?这个对我有用.

这是我做的:

- (void)viewDidLoad
{
    ...

    [self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];
}
Run Code Online (Sandbox Code Playgroud)

然后:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"rate"]) {
    if ([self.player rate]) {
        [self changeToPause];  // This changes the button to Pause
    }
    else {
        [self changeToPlay];   // This changes the button to Play
    }
}
}
Run Code Online (Sandbox Code Playgroud)

  • 我在iOS5中尝试过.为了让我的观察者被调用,我不得不为观察者添加选项:`NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew`. (3认同)

The*_*der 17

对于i OS 10以上版本,您可以检查AVPlayer timeControlStatus的新属性.

if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPaused)
{
//Paused mode
}
else if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying)
{
 //Play mode
}
Run Code Online (Sandbox Code Playgroud)

  • 但当它发生变化时,你如何实际收到通知呢? (2认同)

Kum*_*amy 6

AVPalyer作为默认观察者来跟踪视频的当前持续时间,当您暂停或恢复视频时,您可以通过使用一个全局变量获取暂停时间(内部观察者更新该变量)

CMTime interval = CMTimeMake(1,1);

//The capture of self here is coming in with your implicit property access of self.currentduration - you can't refer to self or properties on self from within a block that will be strongly retained by self.

//You can get around this by creating a weak reference to self before accessing timerDisp inside your block
__weak typeof(self) weakSelf = self;

self.timeObserverToken = [_player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock: ^(CMTime time)
{
    _currentDuration = (int)CMTimeGetSeconds (_player.currentTime);

    if(!_isPlaying)
    {
        _pausedDuration = _currentDuration;
    }
}
Run Code Online (Sandbox Code Playgroud)


Xti*_* D. 5

如果您的目标是 iOS 13 及更高版本,您可以使用以下方法优雅地完成此任务Combine

cancellable = myAVPlayerInstance.publisher(for: \.timeControlStatus)
    .sink { [unowned self] status in
       ...
    }
Run Code Online (Sandbox Code Playgroud)

哪里status有任何case一个AVPlayer.TimeControlStatus