试图理解 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)

希望这个解释有所帮助。如需进一步澄清,请不要犹豫,在此帖子上发布更多问题。

【讨论】:

很好的解释 我想知道为什么 setMaxRecordedDurationframe_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 的问题

如何使用第二个值将用户价值添加到 CMTimeMake

Swift 3 中的 NSValue(CMTime: )?

如何使用 NSTimeInterval 进行 CMTime 引用

尝试将 CMTime 存储为 Core Data 上的可转换属性