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.