我正在寻找一种方法来获知AVPlayer
开始播放的确切时刻。有“费率”属性,但目前我正在定期检查NSTimer
以获取更新。
我试过KVO,但显然它不符合KVO。
我也是KVO订阅了AVPlayerItem's
“状态”,但它显示了HTTP资产何时完成缓存,没有播放/暂停。我也开始收集播放/暂停的所有调用,之后请求即时UI更新,但在AVPlayer
真正开始播放之前需要更多的runloops。我只是想立即更新我的按钮。
答案 0 :(得分:47)
为什么你说“费率”不是KVO投诉? 它对我有用。
这是我做的:
- (void)viewDidLoad
{
...
[self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];
}
然后:
- (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
}
}
}
答案 1 :(得分:14)
对于i OS 10 以上您可以检查AVPlayer的新属性 timeControlStatus 。
if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPaused)
{
//Paused mode
}
else if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying)
{
//Play mode
}
答案 2 :(得分:6)
AVPalyer作为默认观察者来跟踪视频的当前持续时间,当您暂停或恢复视频时,您可以通过使用一个全局变量(内部观察者更新该变量)获得暂停时间
CMTime间隔= CMTimeMake(1,1);
.bloc > svg
答案 3 :(得分:0)
player = AVPlayer(url: URL(fileURLWithPath: path))
player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "rate" {
if player.rate > 0 {
print("video started")
}
}
}
迅速
答案 4 :(得分:0)
1)将以下(观察者)代码添加到您的avPlayer对象中
self.player?.addObserver(self, forKeyPath: "rate", options: [], context: nil)
2)和下面的代表
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "rate") {
if ((player?.rate) == 1) {
print("Plyaing")
} else {
print("Pause")
}
}
}