68

我看过一些CMTime例子 (三个单独的链接),但我还是不明白。我正在使用带有 AVCaptureVideoDataOutput 的 AVCaptureSession,我想设置输出的最大和最小帧速率。我的问题是我只是不了解 CMTime 结构。

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

为什么没有记录在任何地方以解释它的作用?

如果它真的像那样工作,我将如何让它拥有无限数量的帧?

如果它真的很简单,我很抱歉,但还没有点击。

4

2 回答 2

176

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

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

CMTimeCompare(t3, t4) == 0

如果您设置videoMinFrameDurationa AVCaptureSessionis 并没有什么不同,如果您设置

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

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

于 2012-10-21T20:32:28.647 回答
3

我的经历不同。

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

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

“383 百分之一秒”

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

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

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

仍然在视频中寻找相同的位置,但它在调试器侧窗口中显示为“3833 1000ths of a second”

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

不会在视频中寻找相同的位置,因为它已被截断,并且在调试器侧窗口中显示为“3 秒”。请注意,由于首选时间刻度,0.833 部分已丢失。

于 2020-04-07T21:36:28.753 回答