CMTime ve CMTimeMake'i anlamaya çalışmak


149

1) CMTimeMake(1,10)1 saniyelik süre ve 10 veya 10 kare / saniye zaman ölçeği anlamına gelir. Bu, 10 kareli 1 saniye video süresi anlamına mı geliyor?

2)

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

= (2, 10)?

2 saniyelik video ve geçerliTime saniyede 10 kare ile?


1
videonuz 48 FPS (saniyede kare) CMTimeMake(1, 48)ise, saniyenin 1 / 48'inde bir, yani kare başına 1 blok
Honey

Yanıtlar:


168

1) CMTimeMake(1,10)aslında 1 değeri ve 10'luk bir zaman ölçeği anlamına gelir. Bunlar bir pay ve paydadır, yani saniyenin 1 / 10'u, 1 saniye değil.

2) Sonuç CMTimeMake(2, 10)saniyenin 2 / 10'u gibi olacaktır .


14
Apple'ın referansı neden bunu söylemiyor?
vgonisanz

5
Şimdi diyor ki: value/timescale = secondsaçıkça.
JP Illanes

137

Peter haklı. Aşağıdaki kod, kavramı daha net hale getirir:

1)

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

Yukarıdaki kod şunu verir: {3000/600 = 5.000}

Bu, saniyede 600 kare zaman ölçeğine sahip 3000 kare ile toplam 5 saniyelik bir süre anlamına gelir.

2)

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

Bu, {10000/600 = 16.667} verir

Bu, saniyede 600 kare zaman ölçeğine sahip 10000 kare ile toplam 16.667 saniye süre anlamına gelir.

CMTimeMake (int64_t değeri, int32_t zaman ölçeği) ve CMTimeMakeWithSeconds (Float64 saniye, int32_t preferTimeScale) arasındaki farka dikkat edin

Umarım bu açıklama yardımcı olur. Daha fazla açıklama için, lütfen bu gönderiye başka soru göndermekten çekinmeyin.


Çok güzel açıklama
Corey Floyd

Acaba neden setMaxRecordedDurationihtiyaç preferredTimeScaleolduğunda frame_ratefarklı şekilde ayarlanır. Herkes körü körüne 600 kullanıyor ve tam olarak ne yaptığına dair iyi bir açıklama yok.
26'da kısa çizgi

2
@dashesy 600, yaygın video kare hızlarının bir katıdır. Warren Moore bunu warrenmoore.net/understanding-cmtime adresinde oldukça iyi açıklıyor .
danimal

38

İle CMTimeMake(A, B)sen mantıklı sayıda tam kesir depolamak A / Bsaniye

  • CMTimeMake(1, 4) -> 0.25 saniye zaman aralığı

İle CMTimeMakeWithSeconds(A, B)saklamak A saniye bir çözünürlüğe Badımlar

  • CMTimeMakeWithSeconds(0.25, ...) -> 0.25 saniye zaman aralığı

Genelde görürsünüz CMTimeMakeWithSeconds(time, NSEC_PER_SEC). NSEC_PER_SECEtkili bir şekilde "anlamına maksimum çözünürlük ".


9

Sadece 1 saniyelik aralıkların nasıl yapılacağını bilmek istiyorsanız (benim gibi), cevabınız budur:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

2

Bir CMTime yapısı, bir length of time that is stored as rational number.CMTime değerine ve zaman ölçeğine sahip olduğunu ve zaman değerini / zaman ölçeği saniyelerini temsil eder.

Bkz açıktır bu SO Cevap bakın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.