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.