AVPlayer中的CMTime的addPeriodicTimeObserverForInterval:回调永远不会达到项目的持续时间

时间:2016-06-22 19:12:37

标签: ios objective-c avplayer avplayeritem cmtime

我使用AVPlayer的-(id)addPeriodicTimeObserverForInterval: queue: usingBlock:方法将UI更新到播放进度。但是,我的进度条永远不会结束。

CMTime duration = self.player.currentItem.asset.duration;
float totalSeconds = (Float64)(duration.value * 1000) / (Float64)(duration.timescale);
NSLog(@"duration: %.2f", totalSeconds);

__weak __typeof(self) welf = self;

_mTimeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(10, 1000)
                                              queue:NULL // main queue
                                         usingBlock:^(CMTime time) {

  float totalSeconds = (Float64)(time.value * 1000) / (Float64)(time.timescale);
  NSLog(@"progress %f", totalSeconds);

                                                }];

日志:

App[2373:792179] duration: 3968.00

点击播放按钮

App[2373:792179] progress 0011.176
App[2373:792179] progress 0021.175
...
App[2373:792179] progress 3701.319
App[2373:792179] progress 3704.000

我不应该期望最后一个号码是3968.0吗?

音频从服务器流式传输。

修改

上次进度编号始终 duration - 0.264 sec无论实际持续时间长度是多少。

这太奇怪了,我希望我们可以在SO上使用表情符号。

2 个答案:

答案 0 :(得分:0)

好问题。尝试使用CMTimeGetSeconds(time)而不是自己计算总秒数。

此外,尝试使用CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC)为定期时间观察者创建时间。

这篇文章帮助我了解了很多关于CMTime的谜团:https://warrenmoore.net/understanding-cmtime

答案 1 :(得分:0)

文档明确指出:

  

只要您希望玩家调用时间观察者,您就必须保留返回的值。