我正在编写一个使用AVFoundation和CMTime的应用程序。我已经记录了使用CMTime创建的CMTimeMake()实例的值。此值似乎四舍五入为最接近的整数。我需要一个没有四舍五入的精确值的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 (指示值没有四舍五入)。那我为什么要失去精确性?
发布于 2011-03-25 08:17:02
如果您阅读CMTime,您将看到它使用分子和分母将时间存储为有理数。分子是int64_t,分母是int32_t。
分子指定多少“蜱”已经通过,分母指定多少“滴答”每秒。
因此,0.5秒可以存储为:
以此类推。你所做的方式,使用
CMTimeMake([[Array objectAtIndex:i]floatValue], 1);表示“每秒有一个滴答”,由于分子是整数,浮点值被截断,因此只存储1。因此,您将时间指定为:1/1,已经过去了一个滴答,每秒一个滴答,所以实际上存储的时间正好是1秒。
要解决这个问题,这取决于您想要做什么,以及您是否关心时间刻度。苹果公司推荐的时间尺度是600,但是如果你不在乎的话,你可以这么做:
CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);这就把时间刻度设为1000,所以每秒1000秒,所以每刻度1毫秒。它还将以秒为单位的时间转换为毫秒。注意,它截断了第4位数字,所以如果你有1.2345,你只得到1.234,而不是1.235。如果这对你很重要,请看roundf。
发布于 2015-03-19 09:59:47
CMTimeMake([:ifloatValue]*1000,1000);
这帮助我得到了准确的时间(毫秒)。干杯。
https://stackoverflow.com/questions/5418077
复制相似问题