Tentando entender o CMTime e o CMTimeMake


145

1) CMTimeMake(1,10)significa duração de 1 segundo e escala de tempo de 10 ou 10 quadros por segundo. Isso significa 1s de duração de vídeo com 10 quadros?

2)

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

= (2, 10)?

2 segundos de vídeo e com 10 quadros por segundo do currentTime?


1
se o vídeo é de 48 FPS (quadros por segundo), então você poderia facilmente fazer CMTimeMake(1, 48)para executar um bloco de código a cada 1/48 de segundo ou seja, 1 bloco por frame
Mel

Respostas:


163

1) CMTimeMake(1,10)na verdade significa um valor de 1 e uma escala de tempo de 10. Eles são um numerador e um denominador; portanto, é 1/10 de segundo, não 1 segundo.

2) O resultado será semelhante CMTimeMake(2, 10), que é 2 / 10ths de segundo.


11
Por que a referência da apple não diz isso?
vgonisanz

4
Agora diz: value/timescale = secondsexplicitamente.
JP Illanes

137

Peter está certo. O código a seguir torna o conceito mais claro:

1)

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

O código acima fornece: {3000/600 = 5.000}

O que significa uma duração total de 5 segundos, com 3000 quadros com uma escala de tempo de 600 quadros por segundo.

2)

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

Este fornece {10000/600 = 16.667}

O que significa uma duração total de 16.667 segundos, com 10.000 quadros com uma escala de tempo de 600 quadros por segundo.

Observe a diferença entre CMTimeMake (valor int64_t, escala de tempo int32_t) e CMTimeMakeWithSeconds (Float64 segundos, int32_t preferidoTimeScale)

Espero que esta explicação ajude. Para mais esclarecimentos, não hesite em postar mais perguntas sobre este post.


Explicação muito boa
Corey Floyd

Gostaria de saber por que setMaxRecordedDurationprecisa do preferredTimeScalequando frame_rateé definido de forma diferente. Todo mundo está cegamente usando 600, e não há uma boa explicação para exatamente o que está fazendo.
dashesy

2
O @dashesy 600 é um múltiplo das taxas de quadros de vídeo comuns. Warren Moore explica isso em warrenmoore.net/understanding-cmtime muito bem.
Danimal

38

Com CMTimeMake(A, B)você armazena um número racional, uma fração exata de A / Bsegundos

  • CMTimeMake(1, 4) -> o intervalo de tempo 0,25 segundos

Com CMTimeMakeWithSeconds(A, B)você armazena A segundos em uma resolução de Betapas

  • CMTimeMakeWithSeconds(0.25, ...) -> o intervalo de tempo 0,25 segundos

Você costuma ver CMTimeMakeWithSeconds(time, NSEC_PER_SEC). O NSEC_PER_SECsignifica efetivamente " resolução máxima ".


8

Se você quer apenas saber como fazer um intervalo por 1 segundo (como eu), esta é sua resposta:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.