哪些CMTime是无效的?

What kinds of CMTime are invalid?

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

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

All fields are 0, so you can calloc or fill with 0's to make lots of them. Do not test against this using (time == kCMTimeInvalid), there are many CMTimes other than this that are also invalid. Use CMTIME_IS_INVALID(time) instead.


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

+infinity + +infinity == +infinity

  • -infinity + -infinity == -infinity
  • +infinity + -infinity == invalid
  • -infinity + +infinity == invalid

  • 根据您发布的文档,它说:

    Use CMTIME_IS_INVALID(time) instead.

    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))
    

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

    有五种可能的状态:

    1. +Infinity:这类似于Float.Infinity。这是一个有效值,仅大于任何有限数。你会如何使用它?例如,假设一个 API 为您提供有关视频中时间范围的信息,由两个 CMTime 标识。您可以使用 (-Infinity, +Infinity) 调用它来询问有关整个视频的信息。
    2. -无穷大:这又类似于-Float.Infinity.
    3. Indefinite:据我了解,这类似于 Float.NaN。当您不知道要使用什么值时使用它,例如直播流的持续时间,如 Apple suggests。例如,使用无穷大是不正确的,因为直播不会永远持续下去。它的持续时间是有限的;我们只是还不知道。
    4. 无效:这是一个不遵守CMTime规则的CMTime结构。我认为这意味着诸如零或负分母之类的东西。由于 CMTime 是一个 C 结构,它没有被封装,所以有人可以像这样创建一个具有无效值的结构。 C 结构不能有引发异常或 return nil.
    5. 的初始化程序
    6. 数值:这是有限值的正常情况。使用 CMTIME_IS_NUMERIC 来检查这一点。对于上述所有奇怪的情况,它 return 都是错误的。