Cercando di capire CMTime e CMTimeMake

1) CMTimeMake(1,10) significa durata di 1 secondo e scala temporale di 10 o 10 fotogrammi al secondo. Questo significa la durata del video di 1 s con 10 fotogrammi?

2)

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

= (2, 10)?

2 secondi di video e con 10 fotogrammi al secondo del tempo corrente?

1) CMTimeMake(1,10) significa in realtà un valore di 1 e una scala temporale di 10. Sono un numeratore e un denominatore, quindi è 1/10 di secondo, non 1 secondo.

2) Il risultato sarà come CMTimeMake(2, 10) , che è 2/10 di secondo.

Peter ha ragione. Il seguente codice rende il concetto più chiaro:

1)

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

Il codice sopra dà: {3000/600 = 5.000}

Il che significa una durata totale di 5 secondi, con 3000 fotogrammi con una scala temporale di 600 fotogrammi al secondo.

2)

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

Questo dà {10000/600 = 16,667}

Il che significa una durata totale di 16.667 secondi, con 10000 fotogrammi con una scala temporale di 600 fotogrammi al secondo.

Notare la differenza tra CMTimeMake (int64_t valore, int32_t scala cronologica) e CMTimeMakeWithSeconds (Float64 secondi, int32_t preferredTimeScale)

Spero che questa spiegazione aiuti. Per ulteriori chiarimenti, non esitate a postare ulteriori domande su questo post.

Con CMTimeMake(A, B) si memorizza un numero razionale, una frazione esatta A / B secondi

  • CMTimeMake(1, 4) -> l’intervallo di tempo 0,25 secondi

Con CMTimeMakeWithSeconds(A, B) si memorizza A secondi per una risoluzione di passi B

  • CMTimeMakeWithSeconds(0.25, ...) -> l’intervallo di tempo 0,25 secondi

Comunemente vedi CMTimeMakeWithSeconds(time, NSEC_PER_SEC) . NSEC_PER_SEC significa effettivamente ” risoluzione massima “.

Una struttura CMTime rappresenta un length of time that is stored as rational number. CMTime ha un valore e un campo di scala cronologica e rappresenta il valore temporale / i secondi di tempo.

Vedi Vedi questo SO Risposta che è chiara

Se vuoi solo sapere come fare un intervallo per 1 secondo (come me), questa è la tua risposta:

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