Спроба зрозуміти CMTime та CMTimeMake


145

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

2)

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

= (2, 10)?

2 секунди відео та 10 кадрів в секунду поточного часу?


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
Чому посилання на яблуко не говорять про це?
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_tTTimeScale)

Сподіваюся, це пояснення допомагає. Щоб отримати додаткові роз'яснення, будь ласка, не соромтесь розміщувати додаткові запитання на цій посаді.


Дуже приємне пояснення
Corey Floyd

Цікаво, навіщо setMaxRecordedDurationпотрібно, preferredTimeScaleколи frame_rateвстановлено інше. Усі просто сліпо використовують 600, і немає хорошого пояснення, що саме робить.
тире

2
@dashesy 600 - кратна частота кадрів відео. Воррен Мур дуже добре пояснює це на warrenmoore.net/understanding-cmtime .
танцювальний

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Фактично означає « максимальний дозвіл ».


8

Якщо ви хочете лише знати, як зробити інтервал на 1 секунду (як я), це ваша відповідь:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.