2010-10-23 2 views
122

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

2)

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

= (2, 10)?

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

+0

если ваше видео 48 FPS (кадров в секунду), тогда вы легко выполнили бы «CMTimeMake (1, 48)» для запуска блока кода каждые 1/48 секунды, т.е. 1 блок за кадр – Honey

ответ

135

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

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

+6

Почему ссылка на яблоко не говорит об этом? – vgonisanz

+0

@Piperoman Он сказал. – Henry

+2

Теперь он говорит: 'значение/timescale = seconds' явно. – Raspu

121

Peter is right. Следующий код делает концепцию более четкое:

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_t preferredTimeScale)

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

+1

Отличный ответ - очень ясно. Спасибо! – jocull

+0

Очень хорошее объяснение –

+0

Интересно, почему 'setMaxRecordedDuration' нуждается в' preferredTimeScale', когда 'frame_rate' задано по-разному. Все просто слепо используют 600, и нет никаких хороших объяснений относительно того, что он делает. – dashesy

30

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

2

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

См See this SO Answer which is clear

0

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

int seconds = 1; 

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC); 
+1

Можете ли вы добавить описание вашего ответа? – LordWilmore

Смежные вопросы