Mencoba memahami CMTime dan CMTimeMake

145

1) CMTimeMake(1,10)berarti durasi 1 detik dan skala 10, atau 10 frame per detik. Ini berarti 1s durasi video dengan 10 frame?

2)

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

= (2, 10)?

Video 2 detik dan dengan 10 frame per detik saat ini?

lilzz
sumber
1
jika video Anda adalah 48 FPS (bingkai per detik) maka Anda akan dengan mudah melakukannya CMTimeMake(1, 48)untuk menjalankan satu blok kode setiap 1/48 detik yaitu 1 blok per bingkai
Honey

Jawaban:

163

1) CMTimeMake(1,10)sebenarnya berarti nilai 1 dan skala waktu 10. Mereka adalah pembilang dan penyebut, jadi itu adalah 1/10 dari satu detik, bukan 1 detik.

2) Hasilnya akan seperti CMTimeMake(2, 10), yaitu 2/10 dari satu detik.

Peter DeWeese
sumber
12
Mengapa referensi apel tidak mengatakan ini?
vgonisanz
4
Sekarang dikatakan: value/timescale = secondssecara eksplisit.
JP Illanes
137

Peter benar. Kode berikut membuat konsep lebih jelas:

1)

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

Kode di atas memberikan: {3000/600 = 5.000}

Yang berarti total durasi 5 detik, dengan 3000 frame dengan skala waktu 600 frame per detik.

2)

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

Yang ini memberi {10000/600 = 16.667}

Yang berarti total durasi 16,667 detik, dengan 10.000 frame dengan skala waktu 600 frame per detik.

Perhatikan perbedaan antara CMTimeMake (nilai int64_t, int32_t timescale) dan CMTimeMakeWithSeconds (Float64 detik, int32_t preferTimeScale)

Semoga penjelasan ini membantu. Untuk klarifikasi lebih lanjut, jangan ragu untuk mengirim pertanyaan lebih lanjut pada posting ini.

Raunak
sumber
Penjelasan yang sangat bagus
Corey Floyd
Saya bertanya-tanya mengapa setMaxRecordedDurationperlu preferredTimeScalekapan frame_ratediatur secara berbeda. Semua orang hanya menggunakan 600 secara membabi buta, dan tidak ada penjelasan yang tepat tentang apa yang dilakukannya.
dashesy
2
@dashesy 600 adalah kelipatan dari frame rate video yang umum. Warren Moore menjelaskannya di warrenmoore.net/understanding-cmtime dengan cukup baik.
danimal
38

Dengan CMTimeMake(A, B)Anda menyimpan angka rasional, fraksi tepat A / Bdetik

  • CMTimeMake(1, 4) -> interval waktu 0,25 detik

Dengan CMTimeMakeWithSeconds(A, B)Anda menyimpan A detik ke resolusi Blangkah

  • CMTimeMakeWithSeconds(0.25, ...) -> interval waktu 0,25 detik

Anda biasa melihat CMTimeMakeWithSeconds(time, NSEC_PER_SEC). Secara NSEC_PER_SECefektif berarti " resolusi maksimal ".

bcattle
sumber
8

Jika Anda hanya ingin tahu cara membuat interval selama 1 detik (seperti saya), ini adalah jawaban Anda:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
mgyky
sumber
2

CMTime struct mewakili length of time that is stored as rational number.CMTime yang memiliki nilai dan bidang skala waktu, dan mewakili nilai waktu / skala waktu detik.

Lihat Lihat Jawaban SO ini yang jelas

kandelvijaya
sumber