我正在编写一个使用 AVFoundation 和 CMTime 的应用程序。我已经记录了使用 CMTimeMake()
创建的 CMTime
实例的值。该值似乎四舍五入为最接近的整数。我需要一个具有精确值且不四舍五入的 CMTime
实例。
我在 CMTime
引用资料中看到了舍入常量:
enum {
kCMTimeRoundingMethod_RoundHalfAwayFromZero = 1,
kCMTimeRoundingMethod_RoundTowardZero = 2,
kCMTimeRoundingMethod_RoundAwayFromZero = 3,
kCMTimeRoundingMethod_QuickTime = 4,
kCMTimeRoundingMethod_RoundTowardPositiveInfinity = 5,
kCMTimeRoundingMethod_RoundTowardNegativeInfinity = 6,
kCMTimeRoundingMethod_Default = kCMTimeRoundingMethod_RoundHalfAwayFromZero
};
没有任何示例说明我如何控制将这些策略中的哪一个应用到 CMTime
实例?或者,如果这不是正确的方法,我如何从 CMTime
实例中提取精确值?
编辑:
我已经找到并测试了 CMTIME_HAS_BEEN_ROUNDED()
。我将我的 CMTime
实例传递给此函数,它返回 No
(表示该值尚未四舍五入)。那么为什么我会失去精度呢?
最佳答案
如果您阅读 documentation for CMTime
您会看到它使用分子和分母将时间存储为有理数。分子是int64_t
,分母是int32_t
。
分子指定了多少个“滴答声”,分母指定了每秒多少个“滴答声”。
所以 0.5 秒可以存储为:
- 100/200:100 个滴答声,每秒 200 个滴答声
- 500/1000:500 次计时,每秒 1000 次计时
- 8/16,8 个滴答,每秒 16 个滴答
等等。你这样做的方式,使用
CMTimeMake([[Array objectAtIndex:i]floatValue], 1);
表示“每秒有一个滴答声”,由于分子是整数,浮点值被截断,因此只存储 1。因此,您将时间指定为:1/1
,一个滴答已经过去,每秒一个滴答,所以您实际上存储正好 1 秒。
要解决此问题,这取决于您想做什么以及您是否关心时间尺度。 Apple recommends a timescale of 600 , 但如果你不在乎,你可以这样做:
CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);
将时间刻度设置为 1000,即每秒 1000 次滴答,即每滴答 1 毫秒。它还将以秒为单位的时间转换为毫秒。请注意,它会截断第 4 位数字,因此如果您有 1.2345,您只会得到 1.234 而不是 1.235。如果这对您很重要,请参阅 roundf
。
关于iphone - 使用不四舍五入的 CMTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5418077/