CMTime

作者: Rui哥 | 来源:发表于2017-11-22 20:56 被阅读10次

    最近看到一篇关于CMTime的文章,感觉讲得通俗易懂,正好最近也在看相关的资料就顺便记录下来,以便自己今后回忆复习.

    准确的看待时间

    大部分人是不需要精确的知道时间的。举一个极端的,如果你是奥运会百米运动员,你可能会关心你和时间记录之间的微秒差距.但就现状来说,目前的时间表示就已经很不错了。但是在多媒体中,我们可能会关心很长的 ( 几天或几周 ) 或很短的 ( 十几微秒 ) 的时间。

    如果我们想表示一个视频文件中的某一瞬间,如35:06,我们可能会用双精度浮点数来表示它,比如:

    NSTimeInterval t = 2106.0。大部分时候这样是没错的,但是我们想把时间分的特别细的时候这个就不行了。我所了解的大部分平台 ( sizeof(NSTimeInterval) == sizeof(Float64) == sizeof(double) == 8 ),一个浮点数,如double,只能粗略的表示小数点后16位。

    浮点数在某些时候重复操作 ( 如加减乘除等 ) 会遇到一些问题,比如在进行一系列的运算之后,浮点数表示的时间可能就和准确时间产生较大区别,就可能在同步多媒体流时产生一些错误。

    比如将一百万个0.0000001相加,运算结果可能会变成1.0000000000079181,产生这个问题的原因是浮点数不能准确的表示10的-6次方。这个错误不是那么明显,但是如果你在HTTP流中以每秒上千次的方式运行,还是有可能会出现错误的。

    这就导致我们必须废除以前的浮点计数法,寻找一个新方法来准确的表示时间。

    CMTime是一种C函数结构体,有4个成员。

    typedef struct {
    CMTimeValue value; // 当前的CMTimeValue 的值
    CMTimeScale timescale; // 当前的CMTimeValue 的参考标准 (比如:1000)
    CMTimeFlags flags;
    CMTimeEpoch epoch;
    } CMTime;

    CMTimeValue value; 当前的CMTimeValue 的值

    CMTimeScale timescale; 当前的CMTimeValue 的参考标准,它表示1秒的时间被分成了多少份。因为整个CMTime的精度是由它控制的所以它显的尤为重要。例如,当timescale为1的时候,CMTime不能表示1秒一下的时间和1秒内的增长。相同的,当timescale为1000的时候,每秒钟便被分成了1000份,CMTime的value便代表了多少毫秒。

    如果 timescale = 1000, 我们需要用cmtime表示我们平时说的1s ,那么 CMTimeValue = 1000 * 1 = 1000.

    CMTimeFlags flags; flags的各种值会表示时间戳的正无穷或负无穷,或已经被中间计算为一个结果。这样的数据结构显然比浮点数具有更强的表示力,并且有很多优势。

    平时用的比较多的:

      CMTimeGetSeconds(CMTime time)  
       
      CMTimeMake(int64_t value, int32_t timescale)
       
      CMTimeAdd(CMTime addend1, CMTime addend2)
    
      CMTimeCompare(CMTime time1, CMTime time2)
    
      CMTimeRangeMake(CMTime start,CMTime duration)
    

    相关文章

      网友评论

          本文标题:CMTime

          本文链接:https://www.haomeiwen.com/subject/wzwovxtx.html