gpt4 book ai didi

iphone - 使用不四舍五入的 CMTime?

转载 作者:行者123 更新时间:2023-11-28 18:14:37 25 4
gpt4 key购买 nike

我正在编写一个使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com