2010-10-23 16 views
122

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

2)

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

= (2, 10)?

2 segundos de video y 10 fotogramas por segundo del tiempo actual?

+0

si el vídeo es de 48 fps (fotogramas por segundo) entonces fácilmente haría 'CMTimeMake (1, 48)' para ejecutar un bloque de código cada 1/48 de segundo, es decir, 1 bloque por cuadro – Honey

Respuesta

135

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

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

+6

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

+0

@Piperoman Decía. – Henry

+2

Ahora dice: 'value/timescale = seconds' explícitamente. – Raspu

121

Peter tiene razón. El siguiente código hace que el concepto más claro:

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 fotogramas con una escala de tiempo de 600 fotogramas por segundo.

2)

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

Esto da {10000/600 = 16.667}

Lo que significa una duración total de 16,667 segundos, con 10000 marcos con una escala de tiempo de 600 fotogramas por segundo.

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

Esperanza ayuda a esta explicación. Para obtener más aclaraciones, no dude en publicar más preguntas en esta publicación.

+1

Excelente respuesta, muy clara. ¡Gracias! – jocull

+0

Muy buena explicación –

+0

Me pregunto por qué 'setMaxRecordedDuration' necesita el' preferredTimeScale' cuando 'frame_rate' se establece de manera diferente. Todo el mundo está usando ciegamente 600, y no hay una buena explicación sobre lo que está haciendo exactamente. – dashesy

30

Con CMTimeMake(A, B) permite guardar un número racional, una fracción exacta A/B segundos

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

Con CMTimeMakeWithSeconds(A, B) almacenar Asegundo a una resolución de B pasos

  • CMTimeMakeWithSeconds(0.25, ...) -> El intervalo de tiempo de 0,25 segundos

Usted ve comúnmente CMTimeMakeWithSeconds(time, NSEC_PER_SEC). El NSEC_PER_SEC significa efectivamente "máxima resolución".

2

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

Ver See this SO Answer which is clear

0

Si sólo desea saber cómo hacer un intervalo para 1 segundo (como yo), esta es su respuesta:

int seconds = 1; 

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC); 
+1

¿Puedes agregar alguna explicación sobre tu respuesta? – LordWilmore

Cuestiones relacionadas