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.