Essayer de comprendre CMTime et CMTimeMake

145

1) CMTimeMake(1,10) signifie une durée de 1 seconde et une échelle de temps de 10 ou 10 images par seconde. Cela signifie 1s durée de vidéo avec 10 images?

2)

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

= (2, 10)?

2 secondes de vidéo et avec 10 images par seconde de l'heure actuelle?

Lilzz
la source
1
si votre vidéo est de 48 FPS (image par seconde), vous feriez facilement CMTimeMake(1, 48)d'exécuter un bloc de code tous les 1/48 de seconde soit 1 bloc par image
Honey

Réponses:

163

1) CMTimeMake(1,10)signifie en fait une valeur de 1 et une échelle de temps de 10. Ils sont un numérateur et un dénominateur, donc c'est 1/10 de seconde, pas 1 seconde.

2) Le résultat sera comme CMTimeMake(2, 10), qui est de 2 / 10ème de seconde.

Peter DeWeese
la source
12
Pourquoi la référence d'Apple ne dit pas cela?
vgonisanz
4
Maintenant, il dit: value/timescale = secondsexplicitement.
JP Illanes
137

Peter a raison. Le code suivant rend le concept plus clair:

1)

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

Le code ci-dessus donne: {3000/600 = 5.000}

Ce qui signifie une durée totale de 5 secondes, avec 3000 images avec une échelle de temps de 600 images par seconde.

2)

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

Celui-ci donne {10000/600 = 16,667}

Ce qui signifie une durée totale de 16,667 secondes, avec 10000 images avec une échelle de temps de 600 images par seconde.

Notez la différence entre CMTimeMake (valeur int64_t, échelle de temps int32_t) et CMTimeMakeWithSeconds (Float64 secondes, int32_t preferTimeScale)

J'espère que cette explication vous aidera. Pour plus de précisions, n'hésitez pas à poster d'autres questions sur ce post.

Raunak
la source
Très belle explication
Corey Floyd
Je me demande pourquoi les setMaxRecordedDurationbesoins preferredTimeScalequand frame_ratesont définis différemment. Tout le monde utilise aveuglément 600, et aucune bonne explication quant à ce qu'il fait exactement.
dashesy du
2
@dashesy 600 est un multiple des fréquences d'images vidéo courantes. Warren Moore l'explique assez bien sur warrenmoore.net/understanding-cmtime .
danimal le
38

Avec CMTimeMake(A, B)vous stockez un nombre rationnel, une fraction de A / Bseconde exacte

  • CMTimeMake(1, 4) -> l'intervalle de temps 0,25 seconde

Avec CMTimeMakeWithSeconds(A, B)vous stockez des A secondes à une résolution d' Bétapes

  • CMTimeMakeWithSeconds(0.25, ...) -> l'intervalle de temps 0,25 seconde

Vous voyez souvent CMTimeMakeWithSeconds(time, NSEC_PER_SEC). Le NSEC_PER_SECsignifie effectivement " résolution maximale ".

bovins
la source
8

Si vous voulez seulement savoir comment faire un intervalle d' une seconde (comme moi), voici votre réponse:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
mgyky
la source
2

Une structure CMTime représente un length of time that is stored as rational number.CMTime a une valeur et un champ d'échelle de temps et représente la valeur de temps / les secondes de l'échelle de temps.

Voir Voir cette réponse SO qui est claire

kandelvijaya
la source