0

kCMTimeInvalid 是无效的 CMTime,但是根据 Apple 文档,还有更多的无效 CMTime,它们是什么?CMTime“无效”是什么意思?它是溢出,未启动还是其他?

https://developer.apple.com/documentation/coremedia/kcmtimeinvalid

所有字段均为 0,因此您可以调用或填充 0 来生成大量字段。不要使用 (time == kCMTimeInvalid) 对此进行测试,除此之外还有许多 CMTimes 也是无效的。请改用 CMTIME_IS_INVALID(time)。


我发现了一些 CMTime 无效的情况:

  • 当 flags(CMTimeFlags) kCMTimeFlags_Valid 未设置时。

    kCMTimeFlags_Valid 必须设置,否则 CMTime 被视为无效。

  • CMTimeAdd的一些操作

+无穷大 + +无穷大 == +无穷大

  • -infinity + -infinity == -infinity
  • +infinity + -infinity == 无效
  • -infinity + +infinity == 无效

  • 4

    2 回答 2

    1

    有五种可能的状态:

    1. +Infinity:这类似于 Float.Infinity。这是一个有效值,刚好大于任何有限数。你会如何使用它?例如,想象一个 API 为您提供有关视频中时间范围的信息,该时间范围由两个 CMTimes 标识。您可以使用 (-Infinity, +Infinity) 调用它来询问有关整个视频的信息。
    2. -Infinity:这又类似于 -Float.Infinity。
    3. 不定:据我了解,这类似于 Float.NaN。当您不知道要使用什么值时使用它,例如 Apple建议的直播时长。例如,使用无穷大是不对的,因为直播不会永远持续下去。它有一个有限的持续时间;我们只是还不知道。
    4. 无效:这是一个不遵守 CMTime 规则的 CMTime 结构。我认为这意味着诸如零或负分母之类的东西。由于 CMTime 是一个 C 结构,它没有被封装,所以有人可以创建一个这样的无效值。C 结构不能有引发异常或返回 nil 的初始化程序。
    5. 数字:这是有限值的正常情况。使用CMTIME_IS_NUMERIC进行检查。对于上述所有奇怪的情况,它都返回 false。
    于 2019-03-23T07:52:27.043 回答
    0

    从您发布的文档中,它说:

    请改用 CMTIME_IS_INVALID(time)。

    CMTime.h,看起来CMTIME_IS_INVALID定义为:

    #define CMTIME_IS_INVALID(time) (!CMTIME_IS_VALID(time))
    

    并且CMTIME_IS_VALID定义为:

    #define CMTIME_IS_VALID(time) ((Boolean)(((time).flags & kCMTimeFlags_Valid) != 0))
    

    所以看起来唯一决定 aCMTime是否有效的是kCMTimeFlags_Valid标志是否被设置。

    于 2018-03-26T04:11:38.163 回答