使用CMTime而不进行舍入?

Cri*_*682 0 iphone avfoundation core-media ios avmutablecomposition

我正在编写一个使用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
};
Run Code Online (Sandbox Code Playgroud)

没有任何关于如何控制这些策略应用于CMTime实例的示例?或者,如果这不是正确的方法,我如何从CMTime实例中提取精确值?


编辑:

我找到并测试过了CMTIME_HAS_BEEN_ROUNDED().我将我的CMTime实例传递给了这个函数并返回No(表示该值尚未舍入).那为什么我会失去精确度呢?

fre*_*ace 7

如果您阅读文档,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);
Run Code Online (Sandbox Code Playgroud)

是说"每秒有一个刻度",并且由于分子是一个整数,因此浮点值被截断,因此只存储1.因此,您将时间指定为:1/1,已经过了一个刻度,每秒一个刻度,因此您实际上只存储 1秒.

要解决这个问题,这取决于你想做什么以及你是否关心时间表.Apple建议使用600的时间刻度,但如果你不在乎,你可以这样做:

CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);
Run Code Online (Sandbox Code Playgroud)

这将时间刻度设置为1000,因此每秒1000个刻度,因此每个刻度1毫秒.它还将时间(以秒为单位)转换为毫秒.请注意,它会截断第4位数,所以如果你有1.2345,那么你得到1.234而不是1.235.如果这对你很重要,请参阅roundf.