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?

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

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

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

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

Uma estrutura CMTime representa um length of time that is stored as rational number. CMTime com um valor e um campo de escala de tempo e representa o valor de tempo / segundos da escala de tempo.

Consulte Veja esta resposta SO que está clara

kandelvijaya
fonte