158 votes

Essayer de comprendre CMTime et CMTimeMake

1) CMTimeMake(1,10) signifie une durée de 1 seconde et une échelle de temps de 10, soit 10 images par seconde. Cela signifie que la durée de la vidéo est de 1s 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 ?

1 votes

Si votre vidéo est de 48 FPS (image par seconde), vous pouvez facilement faire CMTimeMake(1, 48) pour exécuter un bloc de code tous les 1/48 de seconde, soit 1 bloc par image

178voto

Peter DeWeese Points 10185

1) CMTimeMake(1,10) signifie en fait une valeur de 1 et une échelle de temps de 10. Il s'agit d'un numérateur et d'un dénominateur. Il s'agit donc de 1/10 de seconde et non de 1 seconde.

2) Le résultat sera le suivant CMTimeMake(2, 10) soit 2/10e de seconde.

21 votes

Pourquoi la référence d'Apple ne dit-elle pas cela ?

5 votes

Maintenant, ça dit : value/timescale = seconds explicitement.

144voto

Raunak Points 1313

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}

Cela signifie une durée totale de 5 secondes, avec 3000 images et 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.

Remarquez la différence entre CMTimeMake(int64_t value, int32_t timescale) et CMTimeMakeWithSeconds(Float64 seconds, int32_t preferredTimeScale)

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

0 votes

Très bonne explication

0 votes

Je me demande pourquoi setMaxRecordedDuration besoins de l preferredTimeScale cuando frame_rate est régl de manière différente. Tout le monde utilise 600 à l'aveuglette, sans aucune explication sur ce qu'il fait exactement.

3 votes

@dashesy 600 est un multiple des fréquences d'images vidéo courantes. Warren Moore l'explique à warrenmoore.net/understanding-cmtime assez bien.

39voto

bcattle Points 475

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

  • CMTimeMake(1, 4) -> l'intervalle de temps 0.25 secondes

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

  • CMTimeMakeWithSeconds(0.25, ...) -> l'intervalle de temps 0.25 secondes

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

10voto

mgyky Points 2267

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

2voto

kandelvijaya Points 1144

Une structure CMTime représente un length of time that is stored as rational number. CMTime possède un champ de valeur et un champ d'échelle de temps, et représente la valeur du temps/échelle de temps en secondes .

Ver Voir cette réponse du SO qui est claire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X