试图了解CMTime和CMTimeMake

lil*_*lzz 141 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)
Run Code Online (Sandbox Code Playgroud)

=(2,10)?

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

Pet*_*ese 157

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

2)结果将是CMTimeMake(2, 10),即2/10秒.

  • 为什么苹果的参考不说这个? (7认同)
  • 现在它明确地说:`value/timescale = seconds`. (3认同)

Rau*_*nak 135

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

1)

Float64 seconds = 5; 
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);
Run Code Online (Sandbox Code Playgroud)

上面的代码给出:{3000/600 = 5.000}

这意味着总持续时间为5秒,3000帧,时间刻度为每秒600帧.

2)

int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);
Run Code Online (Sandbox Code Playgroud)

这个给出{10000/600 = 16.667}

这意味着总持续时间为16.667秒,10000帧,时间刻度为每秒600帧.

注意CMTimeMake(int64_t值,int32_t时间刻度)和CMTimeMakeWithSeconds(Float64秒,int32_t preferredTimeScale)之间的区别

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

  • @dashesy 600是常见视频帧速率的倍数。沃伦·摩尔(Warren Moore)在http://warrenmoore.net/understanding-cmtime上对此进行了很好的解释。 (2认同)

bca*_*tle 36

随着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实际上意味着" 最高分辨率 ".


mgy*_*yky 6

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

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
Run Code Online (Sandbox Code Playgroud)