web-dev-qa-db-fra.com

Essayer de comprendre CMTime et CMTimeMake

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 une durée de vidéo de 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 10 images par seconde du temps actuel?

137
lilzz

1) CMTimeMake(1,10) signifie en réalité une valeur de 1 et une échelle de temps de 10. Ils sont un numérateur et un dénominateur, il est donc de 1/10 de seconde et non de 1 seconde.

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

155
Peter DeWeese

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

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

133
Raunak

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

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

Avec CMTimeMakeWithSeconds(A, B), vous enregistrez Asecondes avec une résolution de B étapes

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

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

35
bcattle

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

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
6
mgyky

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/échelle de temps en secondes.

Voir Voir ceci SO Réponse claire

2
kandelvijaya