试图了解CMTime

时间:2012-10-15 19:11:11

标签: ios avcapturesession cmtime

我看过一些examples of CMTime(三个单独的链接),但我仍然没有得到它。我正在使用AVCaptureSession和AVCaptureVideoDataOutput,我想设置输出的最大和最小帧速率。我的问题是我只是不理解CMTime结构。

显然CMTimeMake(value,timeScale)应该每1 / timeScale秒给我一个值帧,总共得到value / timeScale秒,或者我错了吗?

为什么不在任何地方记录这些以解释它的作用?

如果它真的像那样工作,我怎么能让它有无限数量的帧?

如果真的很简单,我很抱歉,但还没有点击任何内容。

2 个答案:

答案 0 :(得分:133)

CMTime结构表示存储为有理数的时间长度(请参阅CMTime Reference)。 CMTime有一个value和一个timescale字段,代表时间value/timescale seconds

CMTimeMake是一个返回CMTime结构的函数,例如:

CMTime t1 = CMTimeMake(1, 10); // 1/10 second = 0.1 second
CMTime t2 = CMTimeMake(2, 1);  // 2 seconds
CMTime t3 = CMTimeMake(3, 4);  // 3/4 second = 0.75 second
CMTime t4 = CMTimeMake(6, 8);  // 6/8 second = 0.75 second

最后两个时间值t3t4代表相同的时间值,因此

CMTimeCompare(t3, t4) == 0

如果您设置videoMinFrameDuration的{​​{1}},则设置

时无效
AVCaptureSession

在这两种情况下,帧之间的最小时间间隔设置为1/20 = 0.05秒。

答案 1 :(得分:2)

我的经历与众不同。

对于let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

如果设置断点并在调试器侧窗口中查看,则会显示:

“ 383秒”

通过在AVPlayer中寻找视频中的固定偏移量进行测试已证实了这一点。

因此,将实际的秒数输入“秒”字段,并将精度输入“ preferredTimescale”字段。所以100表示​​百分之一秒的精度。

let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

Still仍在视频中寻找相同的位置,但在调试器侧窗口中显示为“ 3833 1000秒”

let testTime = CMTime(seconds: 3.83, preferredTimescale: 1)

由于视频已被截断,因此不会在视频中寻找相同的位置,并且在调试器侧窗口中显示为“ 3秒”。请注意,由于preferredTimescale,.833部分已丢失。