web-dev-qa-db-fra.com

Essayer de comprendre CMTime

J'ai vu quelques exemplessurCMTime (trois liens distincts), mais je ne comprends toujours pas. J'utilise un AVCaptureSession avec AVCaptureVideoDataOutput et je veux définir la fréquence d'images maximale et minimale de la sortie. Mon problème est que je ne comprends tout simplement pas la structure CMTime.

Apparemment, CMTimeMake (valeur, timeScale) devrait me donner des trames de valeur toutes les 1/timeScale secondes pour un total de value/timeScale secondes, ou est-ce que je me trompe?

Pourquoi cela n'est-il documenté nulle part afin d'expliquer ce que cela fait?

Si cela fonctionne vraiment comme ça, comment pourrais-je obtenir un nombre indéfini d'images?

Si c'est vraiment simple, je suis désolé, mais rien n'a encore cliqué.

45
RileyE

Une structure CMTime représente une durée qui est stockée sous forme de nombre rationnel (voir Référence CMTime ). CMTime a un champ value et un champ timescale et représente l'heure value/timescale seconds.

CMTimeMake est une fonction qui renvoie une structure CMTime, par exemple:

CMTime t1 = CMTimeMake(1, 10); // 1/10 second = 0.1 second
CMTime t2 = CMTimeMake(2, 1);  // 2 seconds
CMTime t3 = CMTimeMake(3, 4);  // 3/4 second = 0.75 second
CMTime t4 = CMTimeMake(6, 8);  // 6/8 second = 0.75 second

Les deux dernières valeurs de temps t3 et t4 représente la même valeur de temps, donc

CMTimeCompare(t3, t4) == 0

Si vous définissez le videoMinFrameDuration d'un AVCaptureSession is ne fait pas de différence si vous définissez

connection.videoMinFrameDuration = CMTimeMake(1, 20); // or
connection.videoMinFrameDuration = CMTimeMake(2, 40);

Dans les deux cas, l'intervalle de temps minimum entre les images est défini sur 1/20 = 0,05 seconde.

137
Martin R