2010-10-23 40 views
122

1) CMTimeMake(1,10) có nghĩa là thời lượng 1 giây và khoảng thời gian là 10 hoặc 10 khung hình mỗi giây. Điều này có nghĩa là thời lượng 1s của video với 10 khung hình?Cố gắng hiểu CMTime và CMTimeMake

2)

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

= (2 10)?

2 giây video và 10 khung hình/giây của thời gian hiện tại?

+0

nếu video của bạn là 48 FPS (khung mỗi giây) bạn sẽ dễ dàng thực hiện 'CMTimeMake (1, 48)' để chạy một khối mã mỗi 1/48 của một giây nghĩa là 1 khối trên mỗi khung – Honey

Trả lời

135

1) CMTimeMake(1,10) thực sự có nghĩa là giá trị là 1 và một khoảng thời gian là 10. Một tử số và mẫu số, vì vậy nó bằng 1/10 giây, không phải 1 giây.

2) Kết quả sẽ giống như CMTimeMake(2, 10), là 2/10 giây.

+6

Tại sao tham chiếu của apple không nói điều này? – vgonisanz

+0

@Piperoman Nó nói. – Henry

+2

Bây giờ nó nói: 'value/timescale = seconds' một cách rõ ràng. – Raspu

121

Peter đúng. Các mã sau đây làm cho các khái niệm rõ ràng hơn:

1)

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

Đoạn mã trên cho: {3000/600 = 5.000}

Có nghĩa là tổng thời gian 5 giây, với 3000 khung hình với khoảng thời gian 600 khung hình mỗi giây.

2)

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

một này mang đến cho {10000/600 = 16,667}

Có nghĩa là tổng thời gian 16,667 giây, với 10000 khung với một khoảng thời gian là 600 khung hình mỗi giây.

Chú ý sự khác biệt giữa CMTimeMake (int64_t giá trị, khoảng thời gian int32_t) và CMTimeMakeWithSeconds (Float64 giây, int32_t preferredTimeScale)

Hope lời giải thích này sẽ giúp. Để biết thêm chi tiết, vui lòng đăng câu hỏi thêm về bài đăng này.

+1

Câu trả lời xuất sắc - rất rõ ràng. Cảm ơn bạn! – jocull

+0

Giải thích rất hay –

+0

Tôi tự hỏi tại sao 'setMaxRecordedDuration' cần' priorityTimeScale' khi 'frame_rate' được đặt khác nhau. Tất cả mọi người chỉ là mù quáng sử dụng 600, và không có lời giải thích tốt để chính xác những gì nó đang làm. – dashesy

30

Với CMTimeMake(A, B) bạn lưu trữ một số lượng hợp lý, một phần chính xác A/B giây

  • CMTimeMake(1, 4) -> thời gian khoảng 0,25 giây

Với CMTimeMakeWithSeconds(A, B) bạn lưu trữ Agiây để độ phân giải B bước

  • CMTimeMakeWithSeconds(0.25, ...) -> khoảng thời gian 0,25 giây

Bạn thường thấy CMTimeMakeWithSeconds(time, NSEC_PER_SEC). NSEC_PER_SEC có nghĩa là "độ phân giải tối đa".

2

Cấu trúc CMTime đại diện cho length of time that is stored as rational number. CMTime có giá trị và trường thời gian và biểu thị giá trị thời gian/giây thời gian.

Xem See this SO Answer which is clear

0

Nếu bạn chỉ muốn biết làm thế nào để làm cho một khoảng thời gian cho 1 giây (như tôi), đây là câu trả lời của bạn:

int seconds = 1; 

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC); 
+1

Bạn có thể thêm một số giải thích xung quanh câu trả lời của mình không? – LordWilmore

Các vấn đề liên quan