首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMTime没有四舍五入?

使用CMTime没有四舍五入?
EN

Stack Overflow用户
提问于 2011-03-24 10:59:15
回答 2查看 2.4K关注 0票数 1

我正在编写一个使用AVFoundation和CMTime的应用程序。我已经记录了使用CMTime创建的CMTimeMake()实例的值。此值似乎四舍五入为最接近的整数。我需要一个没有四舍五入的精确值的CMTime实例。

我在CMTime引用中看到了四舍五入常量:

代码语言:javascript
复制
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 (指示值没有四舍五入)。那我为什么要失去精确性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 08:17:02

如果您阅读CMTime,您将看到它使用分子和分母将时间存储为有理数。分子是int64_t,分母是int32_t

分子指定多少“蜱”已经通过,分母指定多少“滴答”每秒。

因此,0.5秒可以存储为:

  • 100/ 200 : 100滴答,每秒200滴答
  • 500/ 1000 : 500滴答,每秒1000滴答
  • 8/ 16,8滴答,每秒16滴答

以此类推。你所做的方式,使用

代码语言:javascript
复制
CMTimeMake([[Array objectAtIndex:i]floatValue], 1);

表示“每秒有一个滴答”,由于分子是整数,浮点值被截断,因此只存储1。因此,您将时间指定为:1/1,已经过去了一个滴答,每秒一个滴答,所以实际上存储的时间正好是1秒。

要解决这个问题,这取决于您想要做什么,以及您是否关心时间刻度。苹果公司推荐的时间尺度是600,但是如果你不在乎的话,你可以这么做:

代码语言:javascript
复制
CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);

这就把时间刻度设为1000,所以每秒1000秒,所以每刻度1毫秒。它还将以秒为单位的时间转换为毫秒。注意,它截断了第4位数字,所以如果你有1.2345,你只得到1.234,而不是1.235。如果这对你很重要,请看roundf

票数 8
EN

Stack Overflow用户

发布于 2015-03-19 09:59:47

CMTimeMake([:ifloatValue]*1000,1000);

这帮助我得到了准确的时间(毫秒)。干杯。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5418077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档