试图理解 CMTime 和 CMTimeMake
Posted
技术标签:
【中文标题】试图理解 CMTime 和 CMTimeMake【英文标题】:Trying to understand CMTime and CMTimeMake 【发布时间】:2011-04-29 10:35:58 【问题描述】:1) CMTimeMake(1,10)
表示持续时间为 1 秒,时间刻度为 10,或每秒 10 帧。这意味着1s时长的10帧视频?
2)
CMTime lastTime=CMTimeMake(1,10);
CMTime frameTime=CMTimeMake(1, 10);
CMTime currentTime=CMTimeAdd(lastTime, frameTime)
= (2, 10) ?
2 秒的视频和每秒 10 帧的 currentTime?
【问题讨论】:
如果您的视频是 48 FPS(每秒帧数),那么您可以轻松地执行CMTimeMake(1, 48)
以每 1/48 秒运行一个代码块,即每帧 1 个块
【参考方案1】:
1) CMTimeMake(1,10)
实际上表示值为 1,时间刻度为 10。它们是分子和分母,所以是 1/10 秒,而不是 1 秒。
2) 结果将类似于 CMTimeMake(2, 10)
,即 2/10 秒。
【讨论】:
为什么苹果的参考文献不这么说? 现在它说:value/timescale = seconds
明确。【参考方案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 value, int32_t timescale) 之间的区别 和 CMTimeMakeWithSeconds(Float64 seconds, int32_t preferredTimeScale)
希望这个解释有所帮助。如需进一步澄清,请不要犹豫,在此帖子上发布更多问题。
【讨论】:
很好的解释 我想知道为什么setMaxRecordedDuration
在 frame_rate
设置不同时需要 preferredTimeScale
。每个人都只是盲目地使用 600,并没有很好地解释它到底在做什么。
@dashesy 600 是常见视频帧速率的倍数。 Warren Moore 在warrenmoore.net/understanding-cmtime 上解释得很好。【参考方案3】:
使用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
实际上意味着“最大分辨率”。
【讨论】:
【参考方案4】:一个CMTime结构体代表一个length of time that is stored as rational number.
CMTime有一个值和一个时间刻度字段,并且代表时间值/时间刻度秒数。
见See this SO Answer which is clear
【讨论】:
【参考方案5】:如果你只想知道如何设置 1 秒的间隔(像我一样),这就是你的答案:
int seconds = 1;
CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
【讨论】:
以上是关于试图理解 CMTime 和 CMTimeMake的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CMTimeMake 的时间刻度 Int32 中传递浮点数
AVQueuePlayer seek(to:) 和 CMTime 的问题