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

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 кадров в секунду текущего времени?

5 ответов

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

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

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

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(значение с плавающей точкой 64 секунды, предпочитаемый int32_tTimeScale)

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

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

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

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

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

См. Смотрите этот SO Ответ, который ясен

Допустим, вам нужен 45-й кадр на видео со скоростью 30 кадров в секунду (1,5 секунды).

let frameIndex = 45
let fps = 30

let thumbTime = CMTimeMakeWithSeconds(frameIndex/fps, preferredTimescale: fps)
Другие вопросы по тегам