Sto cercando di capire CMTime e CMTimeMake


145

1) CMTimeMake(1,10) indica una durata di 1 secondo e una scala temporale di 10 o 10 fotogrammi al secondo. Ciò significa 1s di durata del video 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 CurrentTime?


1
se il tuo video è 48 FPS (frame per secondo), allora faresti facilmente CMTimeMake(1, 48)per eseguire un blocco di codice ogni 1/48 di secondo, ovvero 1 blocco per frame
Honey,

Risposte:


163

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

2) Il risultato sarà simile CMTimeMake(2, 10), ovvero 2/10 di secondo.


12
Perché il riferimento di Apple non lo dice?
vgonisanz,

4
Ora dice: value/timescale = secondsesplicitamente.
JP Illanes,

137

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 sopra riportato dà: {3000/600 = 5.000}

Ciò 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}

Ciò 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 (valore int64_t, scala cronologica int32_t) e CMTimeMakeWithSeconds (Float64 secondi, int32_t PreferredTimeScale)

Spero che questa spiegazione sia d'aiuto. Per ulteriori chiarimenti, non esitate a postare ulteriori domande su questo post.


Spiegazione molto bella
Corey Floyd,

Mi chiedo perché abbia setMaxRecordedDurationbisogno di preferredTimeScalequando frame_rateè impostato diversamente. Ognuno sta semplicemente usando ciecamente 600 e nessuna buona spiegazione su cosa stia facendo esattamente.
dashesy

2
@dashesy 600 è un multiplo dei frame rate video comuni. Warren Moore lo spiega abbastanza bene su warrenmoore.net/understanding-cmtime .
danimal

38

Con CMTimeMake(A, B)te memorizzi un numero razionale, una frazione esatta di A / Bsecondi

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

Con CMTimeMakeWithSeconds(A, B)te memorizzare i A secondi per una risoluzione di Bpassaggi

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

Di solito vedi CMTimeMakeWithSeconds(time, NSEC_PER_SEC). Il NSEC_PER_SECmezzo efficace " risoluzione max ".


8

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);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.