Đang cố gắng hiểu CMTime và CMTimeMake


145

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

2)

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

= (2, 10)?

2 giây video và với 10 khung hình mỗi giây của currentTime?


1
nếu video của bạn là 48 FPS (khung hình mỗi giây) thì bạn sẽ dễ dàng thực hiện CMTimeMake(1, 48)để chạy một khối mã cứ sau 1/48 giây tức là 1 khối trên mỗi khung hình
Mật ong

Câu trả lời:


163

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

2) Kết quả sẽ như thế nào CMTimeMake(2, 10), tức là 2/10 giây.


11
Tại sao tài liệu tham khảo của apple không nói điều này?
vgonisanz

4
Bây giờ nó nói: value/timescale = secondsrõ ràng.
JP Illanes

137

Peter nói đúng. Đoạn mã sau làm cho 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 lượng 5 giây, với 3000 khung hình với 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);

Cái này cho {10000/600 = 16.667}

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

Lưu ý sự khác biệt giữa CMTimeMake (giá trị int64_t, thời gian int32_t) và CMTimeMakeWithSeconds (Float64 giây, int32_t preferTimeScale)

Hy vọng lời giải thích này sẽ giúp. Để làm rõ hơn, xin vui lòng gửi câu hỏi thêm về bài viết này.


Giải thích rất hay
Corey Floyd

Tôi tự hỏi tại sao setMaxRecordedDurationcần preferredTimeScalekhi frame_rateđược thiết lập khác nhau. Mọi người chỉ mù quáng sử dụng 600, và không có lời giải thích tốt nào về chính xác những gì nó đang làm.
bảnh bao

2
@dashesy 600 là bội số của tốc độ khung hình video phổ biến. Warren Moore giải thích điều đó tại warrenmoore.net/under Hiểu-cmtime khá tốt.
danimal

38

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

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

Với CMTimeMakeWithSeconds(A, B)bạn lưu trữ A giây để giải quyết các Bbước

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

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


8

Nếu bạn chỉ muốn biết cách tạo khoảng thời gian trong 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);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.