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?

lilzz
fuente
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.

Peter DeWeese
fuente
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.

Raunak
fuente
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 ".

bcattle
fuente
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);
mgyky
fuente
2

Una estructura CMTime representa un length of time that is stored as rational number.CMTime que tiene un valor y un campo de escala de tiempo, y representa el valor de tiempo / segundos de escala de tiempo.

Ver Ver esta respuesta SO que está clara

kandelvijaya
fuente