我使用AVPlayer的
点击播放按钮。
-(id)addPeriodicTimeObserverForInterval: queue: usingBlock:
方法来更新播放进度,但是我的进度条从未到达终点。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秒。
这太奇怪了,我希望我们在SO上可以使用表情符号。
duration:4.736 maxProgress:4.472
。可能的原因是什么?编辑:刚看到您更新了答案,我会尝试其他选项。 - kerdCMTimeGetSeconds
打印持续时间?还有一件事:尝试更精细的回调值。不要使用10秒,而是尝试1.0/30.0
。 - Johannes FahrenkrugCMTimeGetSeconds
的结果。如果不清楚,请见谅。此外,我尝试过的CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC)
是最精细的时间单位 - 它以 10 纳秒为单位,而我在原始帖子中使用的是 0.01 秒。 - kerdCMTimeMakeWithSeconds(1.0/30.0, NSEC_PER_SEC)
。在您的第一个评论中,maxProgress低于持续时间。但在问题中,它比持续时间更高。因此,回调可能只是因为粒度不够细而没有触发。 - Johannes FahrenkrugCMTimeGetSeconds(self.player.currentTime)
比使用传入的time
更准确,因为它实际上是块被调用时的时间。 - Johannes Fahrenkrug