CMTime और CMTimeMake को समझने की कोशिश कर रहा है


145

1) का CMTimeMake(1,10)अर्थ है 1 सेकंड की अवधि और 10 का टाइमसेल, या 10 फ्रेम प्रति सेकंड। इसका मतलब 10 फ्रेम वाले वीडियो की 1s अवधि है?

2)

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

= (2, 10)?

वीडियो के 2 सेकंड और वर्तमान समय के 10 फ्रेम प्रति सेकंड के साथ?


1
अगर आपका वीडियो 48 एफपीएस (फ्रेम प्रति सेकंड) है, तो आप आसानी CMTimeMake(1, 48)से कोड के एक ब्लॉक को हर दूसरे सेकंड के 1/48 यानी 1 ब्लॉक प्रति फ्रेम में चलाने के लिए करेंगे
Honey

जवाबों:


163

1) CMTimeMake(1,10)वास्तव में 1 का मान होता है और 10. का एक समयकाल। वे एक अंश और हर होते हैं, इसलिए यह 1 सेकंड का नहीं, 1 सेकंड का होता है।

2) परिणाम CMTimeMake(2, 10)एक सेकंड के 2/10 वें की तरह होगा ।


11
सेब का संदर्भ यह क्यों नहीं कहता?
वैगनीसांझ

4
अब यह कहता है: value/timescale = secondsस्पष्ट रूप से।
जेपी इलनेस

137

पीटर सही है। निम्नलिखित कोड अवधारणा को और अधिक स्पष्ट करता है:

1)

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

उपरोक्त कोड देता है: {3000/600 = 5.000}

जिसका अर्थ है 5 सेकंड की कुल अवधि, 3000 फ्रेम के साथ 600 फ्रेम प्रति सेकंड के टाइमस्केल के साथ।

2)

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

यह एक {10000/600 = 16.667} देता है

जिसका अर्थ है 16.667 सेकंड की कुल अवधि, 10000 फ्रेम प्रति सेकंड 600 फ्रेम के टाइमसेल के साथ।

CMTimeMake (int64_t value, int32_t timescale) और CMTimeMakeWithSeconds (Float64 सेकंड, int32_t पसंदीदा टाइमसेल) के बीच अंतर पर ध्यान दें

आशा है कि यह व्याख्या मदद करती है। अधिक स्पष्टीकरण के लिए, कृपया इस पोस्ट पर और प्रश्न पोस्ट करने में संकोच न करें।


बहुत अच्छी व्याख्या
कोरी फ्लोयड

मुझे आश्चर्य है कि जब अलग तरीके से सेट किया जाता है तो इसकी setMaxRecordedDurationआवश्यकता क्यों होती है । हर कोई सिर्फ आँख बंद करके 600 का उपयोग कर रहा है, और कोई अच्छी व्याख्या नहीं कर रहा है कि यह क्या कर रहा है। preferredTimeScaleframe_rate
डैशिंग

2
@ डैशिश 600 आम वीडियो फ्रेम दरों की एक बहु है। वारेन मूर इसे warrenmoore.net/understanding-cmtime पर बहुत अच्छी तरह से समझाते हैं
danimal

38

साथ CMTimeMake(A, B)आप एक तर्कसंगत संख्या, एक सटीक अंश स्टोर A / Bसेकंड

  • CMTimeMake(1, 4) -> समय अंतराल 0.25 सेकंड

साथ CMTimeMakeWithSeconds(A, B)आप की दुकान A सेकंड के एक संकल्प के Bचरणों

  • CMTimeMakeWithSeconds(0.25, ...) -> समय अंतराल 0.25 सेकंड

आप आमतौर पर देखते हैं CMTimeMakeWithSeconds(time, NSEC_PER_SEC)NSEC_PER_SECप्रभावी रूप से "का मतलब है अधिकतम संकल्प "।


8

यदि आप केवल 1 सेकंड (मेरे जैसे) के लिए अंतराल बनाना चाहते हैं, तो यह आपका जवाब है:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.