Попытка понять CMTime и CMTimeMake - PullRequest
137 голосов
/ 23 октября 2010

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

2)

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

= (2, 10)?

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

Ответы [ 5 ]

153 голосов
/ 23 октября 2010

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

2) Результат будет похож на CMTimeMake(2, 10), что составляет 2/10-ые секунды.

131 голосов
/ 10 июня 2011

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

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)

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

35 голосов
/ 06 марта 2014

С 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 фактически означает « максимальное разрешение ».

6 голосов
/ 06 февраля 2018

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

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
2 голосов
/ 30 августа 2016

Структура CMTime представляет собой length of time that is stored as rational number. CMTime имеет значение и поле шкалы времени и представляет значение времени / секунды шкалы времени.

См. См. Этот SO-ответ, который является ясным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...