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.