CMTime в addPeriodicTimeObserverForInterval в AVPlayer: обратный вызов никогда не достигает продолжительности элемента
Я использую 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 sec
независимо от фактической продолжительности.
Это так странно, я бы хотел использовать смайлики на SO.
2 ответа
В документах четко указано:
Вы должны сохранить возвращаемое значение до тех пор, пока вы хотите, чтобы наблюдатель вызвал игрока.
Хороший вопрос. Попробуйте использовать CMTimeGetSeconds(time)
вместо того, чтобы вычислять общее количество секунд самостоятельно.
Кроме того, попробуйте использовать CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC)
создать время для периодического наблюдателя времени.
Этот пост очень помог мне обернуть голову в загадку CMTime: https://warrenmoore.net/understanding-cmtime