2010-10-23 10 views
122

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?Tentativo di comprendere CMTime e CMTimeMake

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?

+0

se il video è di 48 fps (frame al secondo) allora si farebbe facilmente 'CMTimeMake (1, 48)' per eseguire un blocco di codice ogni 1/48 di secondo, ovvero 1 blocco per fotogramma – Honey

risposta

135

1) CMTimeMake(1,10) significa in realtà un valore 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), ovvero 2/10 di secondo.

+6

Perché il riferimento di Apple non lo dice? – vgonisanz

+0

@Piperoman Diceva. – Henry

+2

Ora dice: "valore/scala = secondi" esplicitamente. – Raspu

121

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

1)

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

Il codice precedente fornisce: {3000/600 = 5.000}

che significa una durata complessiva di 5 secondi, con 3000 fotogrammi con una scala cronologica 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 complessiva di 16,667 secondi, con 10000 cornici con un orizzonte temporale di 600 fotogrammi al secondo.

notare la differenza tra CMTimeMake (int64_t valore, tempi int32_t) e CMTimeMakeWithSeconds (float64 secondi, int32_t preferredTimeScale)

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

+1

Risposta eccellente - molto chiaro. Grazie! – jocull

+0

Spiegazione molto bella –

+0

Mi chiedo perché 'setMaxRecordedDuration' ha bisogno di' preferredTimeScale' quando 'frame_rate' è impostato diversamente. Tutti stanno usando ciecamente 600, e nessuna spiegazione valida su cosa esattamente stia facendo. – dashesy

30

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

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

Con CMTimeMakeWithSeconds(A, B) di memorizzare Asecondi ad una risoluzione di B gradini

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

È comunemente vedere CMTimeMakeWithSeconds(time, NSEC_PER_SEC). Il NSEC_PER_SEC significa in effetti "risoluzione massima".

2

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 di tempo/i secondi di tempo.

Vedi See this SO Answer which is clear

0

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

int seconds = 1; 

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

Puoi aggiungere qualche spiegazione sulla tua risposta? – LordWilmore

Problemi correlati