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?

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

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

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

Vieh
quelle
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);
mgyky
quelle
2

Eine CMTime-Struktur repräsentiert eine length of time that is stored as rational number.CMTime-Struktur mit einem Wert und einem Zeitskalenfeld und repräsentiert den Zeitwert / die Zeitskala in Sekunden.

Siehe Siehe diese SO Antwort, die klar ist

kandelvijaya
quelle