哪种CMTime无效?

时间:2018-03-26 03:28:31

标签: ios cmtime core-media

kCMTimeInvalid是无效的CMTime,但是基于Apple文档,有更多无效的CMTime,它们是什么? 什么CMTime"无效"手段?它溢出,不知情还是其他什么?

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

  

所有字段均为0,因此您可以使用calloc或填充0来制作大量字段。不要使用(time == kCMTimeInvalid)对此进行测试,除此之外还有许多CMTime也无效。改为使用CMTIME_IS_INVALID(时间)。

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

  • 当标志(CMTimeFlags)未设置kCMTimeFlags_Valid时。

      

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

  • CMTimeAdd的一些操作

  

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

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

  • 2 个答案:

    答案 0 :(得分:1)

    有五种可能的状态:

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

    答案 1 :(得分:0)

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

      

    改为使用CMTIME_IS_INVALID(时间)。

    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标志是否已设置。