试图了解CMTime和CMTimeMake


145

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帧?


1
如果您的视频为48 FPS(每秒帧),则您很容易CMTimeMake(1, 48)每1/48秒运行一个代码块,即每帧1块
亲爱的,

Answers:


163

1)CMTimeMake(1,10)实际上表示1的值和10的时标。它们是分子和分母,所以它是1/10秒,而不是1秒。

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


11
为什么苹果的参考没有这么说?
vgonisanz

4
现在它说:value/timescale = seconds明确。
JP Illanes 2014年

137

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

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)之间的差异

希望这种解释有所帮助。如需进一步的说明,请不要犹豫,在此职位上发表其他问题。


非常好的解释
Corey Floyd 2013年

我想知道为什么setMaxRecordedDuration需要的preferredTimeScale时间frame_rate设置不同。每个人都只是盲目地使用600,而对于它到底在做什么没有很好的解释。
2015年

2
破折号600是普通视频帧速率的倍数。沃伦·摩尔(warren moore)warrenmoore.net/understanding-cmtime上对此进行了很好的解释。
动物

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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.