试着理解 CMTime

我已经看到了一些 例子 CMTime(三个独立的链接) ,但我仍然不明白。我正在使用 AVCaptureSession 和 AVCaptureVideoDataOutput,我想设置输出的最大和最小帧速率。我的问题是我不理解 CMTime 结构。

很明显,CMETimeMake (value,timeScale)应该每1/timeScale 秒给我一个值帧,总共是值/timeScale 秒,还是我弄错了?

为什么没有任何记录来解释这是做什么的?

如果它真的像那样工作,我怎样才能让它有一个不确定的帧数?

如果它真的很简单,我很抱歉,但还没有什么合适的。

34189 次浏览

CMTime结构表示存储为有理数的时间长度(参见 CMTime 参考)。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的一个 AVCaptureSession是没有什么区别,如果你设置

connection.videoMinFrameDuration = CMTimeMake(1, 20); // or
connection.videoMinFrameDuration = CMTimeMake(2, 40);

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

我的经验不同。

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

如果设置了一个断点,并查看调试器端窗口,它会显示:

“383100分之一秒”

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

因此,将实际秒数放在秒字段中,将精度放在 preredTimscale 字段中。所以100意味着百分之一秒的精度。

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

仍然寻找视频中的相同位置,但它在调试器侧窗口显示为“38331000分之一秒”

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

不寻求在视频中的相同地方,因为它已被截断,它显示在调试器侧窗口为“3秒”。注意,.833部分由于首选 Timscale 而丢失。

CMTime(seconds: value, timescale: scale)

表示一秒钟内的价值/比例