พยายามทำความเข้าใจกับ CMTime และ CMTimeMake


145

1) CMTimeMake(1,10)หมายถึงระยะเวลา 1 วินาทีและคูณเวลา 10 หรือ 10 เฟรมต่อวินาที ซึ่งหมายความว่าระยะเวลา 1s ของวิดีโอที่มี 10 เฟรม?

2)

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

= (2, 10)?

วิดีโอ 2 วินาทีและ 10 เฟรมต่อวินาทีของเวลาปัจจุบันหรือไม่


1
หากวิดีโอของคุณคือ 48 FPS (เฟรมต่อวินาที) คุณจะสามารถCMTimeMake(1, 48)เรียกใช้บล็อกได้ทุก ๆ 1/48 ของวินาทีเช่น 1 บล็อกต่อเฟรม
Honey

คำตอบ:


163

1) CMTimeMake(1,10)จริง ๆ แล้วหมายถึงค่า 1 และหนึ่งเท่าของ 10 พวกเขาเป็นเศษและส่วนดังนั้นมันคือ 1/10 ของวินาทีไม่ใช่ 1 วินาที

2) ผลลัพธ์จะเป็นเช่นCMTimeMake(2, 10)2 / 10ths ของวินาที


12
ทำไมการอ้างอิงของแอปเปิ้ลจึงไม่พูดสิ่งนี้
vgonisanz

4
ตอนนี้มันพูดว่า: value/timescale = secondsอย่างชัดเจน
JP Illanes

137

ปีเตอร์ถูกต้อง รหัสต่อไปนี้ทำให้แนวคิดชัดเจนยิ่งขึ้น:

1)

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

โค้ดด้านบนให้: {3000/600 = 5.000}

ซึ่งหมายถึงระยะเวลาทั้งหมด 5 วินาทีด้วย 3,000 เฟรมที่มีช่วงเวลา 600 เฟรมต่อวินาที

2)

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

อันนี้ให้ {10,000/600 = 16.667}

ซึ่งหมายถึงระยะเวลาทั้งหมด 16.667 วินาทีโดยมี 10,000 เฟรมที่มีช่วงเวลา 600 เฟรมต่อวินาที

สังเกตเห็นความแตกต่างระหว่าง CMTimeMake (ค่า int64_t, int32_t timescale) และ CMTimeMakeWithSeconds (Float64 วินาที, int32_t ที่ต้องการ TimeScale)

หวังว่าคำอธิบายนี้จะช่วยได้ สำหรับคำชี้แจงเพิ่มเติมโปรดอย่าลังเลที่จะโพสต์คำถามเพิ่มเติมในโพสต์นี้


คำอธิบายที่ดีมาก
Corey Floyd

ฉันสงสัยว่าทำไมsetMaxRecordedDurationความต้องการpreferredTimeScaleเมื่อframe_rateมีการตั้งค่าที่แตกต่างกัน ทุกคนใช้แค่ 600 คนและไม่มีคำอธิบายที่ดีเกี่ยวกับสิ่งที่กำลังทำ
dashesy

2
@dashesy 600 เป็นอัตราเฟรมวิดีโอทั่วไปหลายรายการ Warren Moore อธิบายได้ที่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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.