Попытка понять 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 имеет значение и поле шкалы времени и представляет значение времени / секунды шкалы времени.
Допустим, вам нужен 45-й кадр на видео со скоростью 30 кадров в секунду (1,5 секунды).
let frameIndex = 45
let fps = 30
let thumbTime = CMTimeMakeWithSeconds(frameIndex/fps, preferredTimescale: fps)