Ich versuche CMTime und CMTimeMake zu verstehen


145

1) CMTimeMake(1,10)bedeutet Dauer von 1 Sekunde und Zeitskala von 10 oder 10 Bildern pro Sekunde. Dies bedeutet 1s Videodauer mit 10 Bildern?

2)

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

= (2, 10)?

2 Sekunden Video und mit 10 Bildern pro Sekunde der aktuellen Zeit?


1
Wenn Ihr Video 48 FPS (Bild pro Sekunde) hat, können Sie problemlos CMTimeMake(1, 48)alle 1/48 Sekunde einen Codeblock ausführen, dh 1 Block pro Bild
Honey

Antworten:


163

1) CMTimeMake(1,10)bedeutet tatsächlich einen Wert von 1 und eine Zeitskala von 10. Sie sind ein Zähler und ein Nenner, also 1/10 Sekunde, nicht 1 Sekunde.

2) Das Ergebnis ist wie CMTimeMake(2, 10)folgt: 2/10 Sekunden.


11
Warum sagt Apples Referenz das nicht?
Vgonisanz

4
Jetzt heißt es: value/timescale = secondsexplizit.
JP Illanes

137

Peter hat recht. Der folgende Code macht das Konzept klarer:

1)

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

Der obige Code gibt an: {3000/600 = 5.000}

Dies bedeutet eine Gesamtdauer von 5 Sekunden bei 3000 Bildern mit einer Zeitskala von 600 Bildern pro Sekunde.

2)

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

Dieser gibt {10000/600 = 16.667}

Dies bedeutet eine Gesamtdauer von 16,667 Sekunden bei 10000 Bildern mit einer Zeitskala von 600 Bildern pro Sekunde.

Beachten Sie den Unterschied zwischen CMTimeMake (int64_t-Wert, int32_t-Zeitskala) und CMTimeMakeWithSeconds (Float64 Sekunden, int32_t PreferredTimeScale).

Hoffe diese Erklärung hilft. Für weitere Erläuterungen zögern Sie bitte nicht, weitere Fragen zu diesem Beitrag zu stellen.


Sehr schöne Erklärung
Corey Floyd

Ich frage mich, warum setMaxRecordedDurationdas preferredTimeScaleWann frame_rateanders eingestellt ist. Jeder benutzt nur blind 600 und keine gute Erklärung, was genau es tut.
Bindestrich

2
@dashesy 600 ist ein Vielfaches der gängigen Videobildraten. Warren Moore erklärt es ziemlich gut unter warrenmoore.net/understanding-cmtime .
Danimal

38

Wenn CMTimeMake(A, B)Sie eine rationale Zahl speichern, einen genauen Bruchteil von A / BSekunden

  • CMTimeMake(1, 4) -> das Zeitintervall 0,25 Sekunden

Mit CMTimeMakeWithSeconds(A, B)speichern Sie A Sekunden bis zu einer Auflösung von BSchritten

  • CMTimeMakeWithSeconds(0.25, ...) -> das Zeitintervall 0,25 Sekunden

Sie sehen häufig CMTimeMakeWithSeconds(time, NSEC_PER_SEC). Das NSEC_PER_SECbedeutet effektiv " maximale Auflösung ".


8

Wenn Sie nur wissen möchten, wie man ein Intervall für 1 Sekunde erstellt (wie ich), ist dies Ihre Antwort:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.