尝试理解CMTime

75
我看过一些关于CMTime的例子(三个不同的链接)但我仍然不明白。我正在使用AVCaptureSession和AVCaptureVideoDataOutput,并希望设置输出的最大和最小帧率。我的问题是我不理解CMTime结构。

显然,CMTimeMake(value,timeScale)应该在1 / timeScale秒内每1次给我value帧,总共value / timeScale秒,或者我理解错了吗?

为什么没有文档来解释这个操作的作用呢?

如果它确实像这样工作,那么我该如何使其拥有无限数量的帧?

如果真的很简单,我很抱歉,但是我还没有完全理解。


可能是尝试理解CMTime和CMTimeMake的重复问题。 - RileyE
2
https://warrenmoore.net/understanding-cmtime - Eimantas
3个回答

186

CMTime结构体代表以有理数形式存储的时间长度(详见CMTime参考文献)。CMTime包含一个value和一个timescale字段,表示时间为value/timescale秒

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
如果你设置了 AVCaptureSessionvideoMinFrameDuration,则无论你如何设置,它都不会有任何区别。
connection.videoMinFrameDuration = CMTimeMake(1, 20); // or
connection.videoMinFrameDuration = CMTimeMake(2, 40);

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


3
如何将3秒转换为CMTime? - Pradeep Reddy Kypa
6
CMTimeMake(3, 1) 表示创建一个时间值为 3 秒的 CMTime 对象,帧率为 1。 - Martin R
@MartinR 为什么不使用固定的十进制数呢?非常感谢。 - Ricardo
@Ricardo:你具体建议什么? - Martin R
@MartinR 这只是一个问题。使用CMTime的原因是什么?也许是使用很多小数的数字?是否可以使用NSDecimalNumber? - Ricardo
显示剩余3条评论

5

我的经验与此不同。

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

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

"383毫秒"

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

所以将实际秒数放入秒字段中,而将精度放入preferredTimescale字段中。因此,100表示精度为百分之一秒。

执行以下操作:let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

仍然在视频的相同位置进行搜索,但在调试器侧窗口中显示为“3833 1000分之一秒”

执行以下操作:let testTime = CMTime(seconds: 3.83, preferredTimescale: 1)

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


0
CMTime(seconds: value, timescale: scale)

在仅一秒钟内的平均值/范围


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接