Próbuję zrozumieć CMTime i CMTimeMake

145

1) CMTimeMake(1,10)oznacza czas trwania 1 sekundy i skalę czasu 10 lub 10 klatek na sekundę. Oznacza to 1s czas trwania filmu z 10 klatkami?

2)

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

= (2, 10)?

2 sekundy wideo i 10 klatek na sekundę bieżącego czasu?

lilzz
źródło
1
jeśli Twój film ma 48 klatek na sekundę (klatek na sekundę), z łatwością CMTimeMake(1, 48)uruchomisz blok kodu co 1/48 sekundy, tj. 1 blok na klatkę
Kochanie

Odpowiedzi:

163

1) CMTimeMake(1,10)faktycznie oznacza wartość 1 i skalę czasu równą 10. Są licznikiem i mianownikiem, więc jest to 1/10 sekundy, a nie 1 sekunda.

2) Wynik będzie podobny CMTimeMake(2, 10), czyli 2/10 sekundy.

Peter DeWeese
źródło
11
Dlaczego referencje Apple tego nie mówią?
vgonisanz
4
Teraz mówi: value/timescale = secondswyraźnie.
JP Illanes
137

Peter ma rację. Poniższy kod wyjaśnia koncepcję:

1)

Float64 seconds = 5; 
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);

Powyższy kod daje: {3000/600 = 5.000}

Co oznacza łączny czas trwania 5 sekund, przy 3000 klatek w skali czasu 600 klatek na sekundę.

2)

int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);

To daje {10000/600 = 16,667}

Oznacza to łączny czas trwania 16,667 sekund, przy 10000 klatek w skali czasu 600 klatek na sekundę.

Zwróć uwagę na różnicę między CMTimeMake (wartość int64_t, skala czasu int32_t) i CMTimeMakeWithSeconds (Float64 sekundy, int32_t preferowaneTimeScale)

Mam nadzieję, że to wyjaśnienie pomoże. Aby uzyskać dalsze wyjaśnienia, nie wahaj się zadawać dalszych pytań w tym poście.

Raunak
źródło
Bardzo ładne wyjaśnienie
Corey Floyd,
Zastanawiam setMaxRecordedDurationsię, preferredTimeScalepo co frame_rateinaczej ustawić kiedy . Wszyscy po prostu ślepo używają 600 i nie ma dobrego wyjaśnienia, co dokładnie robi.
dashesy
2
@dashy 600 to wielokrotność typowych szybkości klatek wideo. Warren Moore całkiem dobrze wyjaśnia to na warrenmoore.net/understanding-cmtime .
danimal
38

Dzięki CMTimeMake(A, B)zapisaniu liczbą wymierną, dokładne frakcji A / Bsekund

  • CMTimeMake(1, 4) -> przedział czasu 0,25 sekundy

Dzięki temu CMTimeMakeWithSeconds(A, B)przechowujesz A sekundy do rozdzielczości Bkroków

  • CMTimeMakeWithSeconds(0.25, ...) -> przedział czasu 0,25 sekundy

Często widzisz CMTimeMakeWithSeconds(time, NSEC_PER_SEC). NSEC_PER_SECSkutecznie oznacza „ Maksymalna rozdzielczość ”.

bydło
źródło
8

Jeśli chcesz wiedzieć, jak zrobić interwał na 1 sekundę (tak jak ja), oto twoja odpowiedź:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
mgyky
źródło