Trying to understand CMTime and CMTimeMake

1) CMTimeMake(1,10) means duration of 1 second and timescale of 10, or 10 frames per second. This means 1s duration of video with 10 frames?

2)

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

= (2, 10) ?

2 seconds of video and with 10 frames per second of the currentTime?

79128 次浏览

1) CMTimeMake(1,10)实际上意味着值为1,时间刻度为10。它们是分子和分母,所以是1/10秒,而不是1秒。

2)结果会像 CMTimeMake(2, 10)一样,也就是0.2秒。

彼得说得对。 以下守则使这一概念更加明确:

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 值,int32 _ t 时间刻度)之间的区别 和 CMTimeMakeWithSecons (Float64秒,int32 _ t preredTimeScale)

希望这个解释有所帮助。为了进一步的澄清,请不要犹豫,张贴进一步的问题在这个职位。

有了 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实际上就是“ 最大分辨率”的意思。

CMTime 结构表示一个 length of time that is stored as rational number. CMTime 具有一个值和一个时间刻度字段,并表示时间值/时间刻度秒。

参见 看到这个如此的答案,这是明确的

间隔1秒

如果你只想知道如何为 1秒制定一个间隔(像我一样) ,这就是你的答案:

int seconds = 1;


CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);