Essayer de comprendre CMTime et CMTimeMake

1) CMTimeMake(1,10) signifie la durée de 1 seconde et l’échelle de temps de 10 ou 10 images par seconde. Cela signifie 1 durée de la 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 10 images par seconde de currentTime?

    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, soit 1/10 de seconde et non 1 seconde.

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

    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, int32_t timescale) et CMTimeMakeWithSeconds (Float64 secondes, int32_t preferredTimeScale)

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

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

    • CMTimeMake(1, 4) -> l’intervalle de temps de 0,25 secondes

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

    • CMTimeMakeWithSeconds(0.25, ...) -> l’intervalle de temps de 0,25 secondes

    Vous voyez généralement CMTimeMakeWithSeconds(time, NSEC_PER_SEC) . NSEC_PER_SEC signifie effectivement ” résolution maximale “.

    Une structure CMTime représente une 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 secondes.

    Voir Voir cette réponse SO qui est claire

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