CMTime

最近看到一篇关于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的文章,感觉讲得通俗易懂,就想着翻译一下,我尽量在语义正确的情况下按照原著来翻译,原文...
    鐵甲陳小寶阅读 6,255评论 3 7
  • 最近在做视频开发,避不开就是会用到CMTime。根据网上之前的教程,CMTime的用法其实挺简单的,例如: 然后告...
    高浩浩浩浩浩浩阅读 22,751评论 11 37
  • 要求时间高精度时一般使用CMTime,比如音频视频。其他一般情况下一般使用NSTimeInterval,NSTim...
    鞋底没纹易摔跤阅读 2,774评论 0 2
  • NSTimeInterval 众所周知,NSTimeInterval是一个把double进行typedef 重定义...
    大猿媛阅读 15,861评论 4 5
  • 通常开发者认为时间的呈现格式应该是浮点数据,我们一般使用NSTimeInterval,实际上它是简单的双精度dou...
    jiangamh阅读 28,242评论 3 37