Попытка понять CMTime и CMTimeMake

145

1) CMTimeMake(1,10)означает длительность 1 секунда и временной масштаб 10 или 10 кадров в секунду. Это означает, что продолжительность видео 1 с 10 кадров?

2)

CMTime lastTime=CMTimeMake(1,10);
CMTime frameTime=CMTimeMake(1, 10);
CMTime currentTime=CMTimeAdd(lastTime, frameTime)

= (2, 10)?

2 секунды видео и 10 кадров в секунду текущего времени?

lilzz
источник
1
если ваше видео 48 кадров в секунду (кадров в секунду), то вы легко могли CMTimeMake(1, 48)бы выполнить блок кода каждые 1/48 секунды, т.е. 1 блок на кадр
Honey

Ответы:

163

1) CMTimeMake(1,10)фактически означает значение 1 и шкалу времени 10. Они являются числителем и знаменателем, поэтому это 1/10 секунды, а не 1 секунда.

2) Результат будет таким, как CMTimeMake(2, 10)2/10 секунды.

Питер ДеВиз
источник
12
Почему ссылка Apple не говорит это?
vgonisanz
4
Теперь он говорит: value/timescale = secondsявно.
JP Illanes
137

Питер прав. Следующий код делает концепцию более понятной:

1)

Float64 seconds = 5; 
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);

Приведенный выше код дает: {3000/600 = 5.000}

Это означает, что общая продолжительность составляет 5 секунд, с 3000 кадров с временной шкалой 600 кадров в секунду.

2)

int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);

Этот дает {10000/600 = 16.667}

Это означает общую длительность 16,667 секунд, с 10000 кадрами с временной шкалой 600 кадров в секунду.

Обратите внимание на разницу между CMTimeMake (значение int64_t, временная шкала int32_t) и CMTimeMakeWithSeconds (значение Float64 секунды, предпочитаемое int32_tTimeScale)

Надеюсь, это объяснение поможет. Для дальнейших разъяснений, пожалуйста, не стесняйтесь размещать дополнительные вопросы на этот пост.

Raunak
источник
Очень хорошее объяснение
Кори Флойд,
Интересно, зачем setMaxRecordedDurationнужно, preferredTimeScaleкогда frame_rateзадается иначе. Каждый просто слепо использует 600, и нет хорошего объяснения, что именно он делает.
дашесы
2
@dashesy 600 - это кратность частоты видеокадров. Уоррен Мур объясняет это на warrenmoore.net/understanding-cmtime довольно хорошо.
danimal
38

С CMTimeMake(A, B)вами хранится рациональное число, точная доля A / Bсекунд

  • CMTimeMake(1, 4) -> временной интервал 0,25 секунды

С CMTimeMakeWithSeconds(A, B)вами хранятся A секунды до разрешения Bшагов

  • CMTimeMakeWithSeconds(0.25, ...) -> временной интервал 0,25 секунды

Вы обычно видите CMTimeMakeWithSeconds(time, NSEC_PER_SEC). NSEC_PER_SECФактически означает « максимальное разрешение ».

bcattle
источник
8

Если вы хотите знать, как сделать интервал в 1 секунду (как я), это ваш ответ:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
mgyky
источник