试图了解CMTime和CMTimeMake

时间:2010-10-23 00:01:52

标签: video ios4

1)CMTimeMake(1,10)表示持续时间为1秒,时间刻度为10或10帧/秒。这意味着1帧视频的持续时间为10帧?

2)

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

=(2,10)?

2秒的视频和每秒10帧的当前时间?

6 个答案:

答案 0 :(得分:153)

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

2)结果将类似CMTimeMake(2, 10),即2/10秒。

答案 1 :(得分:131)

彼得是对的。 以下代码使概念更加清晰:

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时间刻度)之间的区别 和CMTimeMakeWithSeconds(Float64秒,int32_t preferredTimeScale)

希望这个解释有所帮助。如需进一步说明,请随时在此帖子上发布更多问题。

答案 2 :(得分:34)

使用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实际上意味着“最大分辨率”。

答案 3 :(得分:6)

如果您只想知道如何设置 1秒的间隔(就像我一样),这就是您的答案:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

答案 4 :(得分:2)

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

请参阅See this SO Answer which is clear

答案 5 :(得分:0)

假设您要在30fps视频(1.5秒)中显示第45帧

let frameIndex = 45
let fps = 30

let thumbTime = CMTimeMakeWithSeconds(frameIndex/fps, preferredTimescale: fps)