Tratando de entender CMTime y CMTimeMake


145

1) CMTimeMake(1,10)significa duración de 1 segundo y escala de tiempo de 10, o 10 cuadros por segundo. ¿Esto significa 1s de duración de video con 10 cuadros?

2)

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

= (2, 10)?

¿2 segundos de video y con 10 cuadros por segundo del tiempo actual?


1
si el vídeo es de 48 fps (fotogramas por segundo), entonces sería fácil hacer CMTimeMake(1, 48)ejecutar un bloque de código cada 1/48 de un segundo bloque es decir, 1 por cuadro
Miel

Respuestas:


163

1) en CMTimeMake(1,10)realidad significa un valor de 1 y una escala de tiempo de 10. Son un numerador y un denominador, por lo que es 1/10 de segundo, no 1 segundo.

2) El resultado será como CMTimeMake(2, 10), que es 2/10 de segundo.


12
¿Por qué la referencia de Apple no dice esto?
vgonisanz

44
Ahora dice: value/timescale = secondsexplícitamente.
JP Illanes

137

Peter tiene razón. El siguiente código aclara el concepto:

1)

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

El código anterior da: {3000/600 = 5.000}

Lo que significa una duración total de 5 segundos, con 3000 cuadros con una escala de tiempo de 600 cuadros por segundo.

2)

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

Este da {10000/600 = 16.667}

Lo que significa una duración total de 16.667 segundos, con 10.000 fotogramas con una escala de tiempo de 600 fotogramas por segundo.

Observe la diferencia entre CMTimeMake (valor int64_t, int32_t escala de tiempo) y CMTimeMakeWithSeconds (Float64 segundos, int32_t preferredTimeScale)

Espero que esta explicación ayude. Para más aclaraciones, no dude en publicar más preguntas en esta publicación.


Muy buena explicación
Corey Floyd

Me pregunto por qué setMaxRecordedDurationnecesita el preferredTimeScalecuándo frame_rateestá configurado de manera diferente. Todos usan ciegamente 600, y no hay una buena explicación de lo que está haciendo exactamente.
guión

2
@dashesy 600 es un múltiplo de las tasas de cuadros de video comunes. Warren Moore lo explica muy bien en warrenmoore.net/understanding-cmtime .
danimal

38

Con CMTimeMake(A, B)usted almacena un número racional, una fracción de A / Bsegundo exacta

  • CMTimeMake(1, 4) -> el intervalo de tiempo 0.25 segundos

Con CMTimeMakeWithSeconds(A, B)usted almacena A segundos para una resolución de Bpasos

  • CMTimeMakeWithSeconds(0.25, ...) -> el intervalo de tiempo 0.25 segundos

Comúnmente ves CMTimeMakeWithSeconds(time, NSEC_PER_SEC). El NSEC_PER_SECefectivamente significa " resolución máxima ".


8

Si solo quieres saber cómo hacer un intervalo durante 1 segundo (como yo), esta es tu respuesta:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.