CMTime 및 CMTimeMake 이해하려고


145

1) CMTimeMake(1,10)지속 시간은 1 초이고 시간 단위는 10 또는 10 프레임 / 초입니다. 이것은 10 프레임의 비디오 지속 시간을 의미합니까?

2)

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

= (2, 10)?

2 초 분량의 비디오와 현재 시간의 초당 10 프레임?


1
비디오가 48FPS (초당 프레임) 인 경우 초당 CMTimeMake(1, 48)1/48 초마다 코드 블록을 실행합니다. 즉 프레임 당 1 블록
Honey

답변:


163

1) CMTimeMake(1,10)실제로 1 의 값과 10의 시간 척도를 의미합니다. 분자와 분모이므로 1 초가 아닌 1/10 초입니다.

2) 결과는 CMTimeMake(2, 10)2/10 초입니다.


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}입니다.

이는 총 600 초의 시간 간격을 가진 3000 개의 프레임으로 총 5 초의 지속 시간을 의미합니다.

2)

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

이것은 {10000/600 = 16.667}을줍니다.

이는 초당 600 프레임의 시간 단위를 가진 10000 개의 프레임으로 총 16.667 초를 의미합니다.

CMTimeMake (int64_t 값, int32_t 타임 스케일)와 CMTimeMakeWithSeconds (Float64 초, int32_t preferredTimeScale)의 차이점에 유의하십시오.

이 설명이 도움이 되길 바랍니다. 더 자세한 설명을 원하시면 언제든지이 게시물에 추가 질문을 게시하십시오.


아주 좋은 설명
Corey Floyd

왜 때가 다르게 설정되어 있는지 궁금 setMaxRecordedDuration합니다 . 모두가 맹목적으로 600을 사용하고 있으며 정확히 무엇을하는지에 대한 좋은 설명이 없습니다. preferredTimeScaleframe_rate
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.