2016-06-22 8 views
3

Я использую метод AVPlayer -(id)addPeriodicTimeObserverForInterval: queue: usingBlock: для обновления интерфейса до достижения воспроизведения. Однако мой прогресс никогда не заканчивается.CMTime в AVPlayer addPeriodicTimeObserverForInterval: обратный вызов никогда не достигает длительности элемента

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?

Аудио передается с сервера.

EDIT

номер Последний прогресс ВСЕГДАduration - 0.264 sec независимо от фактической длины продолжительность.

Это настолько странно, что мы могли бы использовать смайлики на SO.

ответ

0

Хороший вопрос. Попробуйте использовать CMTimeGetSeconds(time) вместо того, чтобы самостоятельно подсчитывать общие секунды.

Кроме того, попробуйте использовать CMTimeMakeWithSeconds(10.0, NSEC_PER_SEC), чтобы создать время для периодического наблюдателя времени.

Это сообщению помогло мне много, чтобы обернуть мою голову вокруг загадки, которая CMTime: https://warrenmoore.net/understanding-cmtime

+0

Тот же материал (другой звук): 'продолжительность: 4.736 maxProgress: 4.472'. В чем причина? РЕДАКТИРОВАТЬ: только что увидели обновленный ответ, я попробую другие варианты – kerd

+0

Хорошо, я пробовал оба - тот же результат – kerd

+0

@kerd Это очень интересно. Можете ли вы также использовать «CMTimeGetSeconds» для печати продолжительности? И еще одно: попробуйте более тонкую обратную связь. Вместо 10 секунд попробуйте '1.0/30.0'. –

0

Документов четко указано:

Вы должны сохранить возвращаемое значение до тех пор, как вы хотите, чтобы время наблюдателя, вызываемого игроком.

+0

Извините, но не могли бы вы помочь с дальнейшим оформлением того, как эта информация может помочь? Btw, разве наблюдатель уже не вызывается? – kerd

+0

Он говорит, что вам нужно провести сильную ссылку на объект наблюдателя, иначе он будет выпущен. Например, ваш UIViewController может иметь свойство, называемое playerTimeObserver. – user3344977