【问题标题】:Using CMTime without rounding?使用不四舍五入的 CMTime?
【发布时间】:2011-03-24 10:59:15
【问题描述】:

我正在编写一个使用 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(表示该值尚未四舍五入)。那么为什么我会失去精度呢?

【问题讨论】:

    标签: iphone ios avfoundation avmutablecomposition core-media


    【解决方案1】:

    如果您阅读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 个滴答声,因此每个滴答声一毫秒。它还将以秒为单位的时间转换为毫秒。请注意,它会截断第 4 位,所以如果你有 1.2345,你只会得到 1.234 而不是 1.235。如果这对您很重要,请参阅roundf。

    【讨论】:

      【解决方案2】:

      CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);

      这帮助我获得了以毫秒为单位的准确时间。干杯。

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多