×

CMTime简单介绍

96
jiangamh
2015.12.28 18:36* 字数 415

通常开发者认为时间的呈现格式应该是浮点数据,我们一般使用NSTimeInterval,实际上它是简单的双精度double类型,只是typedef了一下,但是由于浮点型数据计算很容易导致精度的丢失,在一些要求高精度的应用场景显然不适合,于是苹果在Core Media框架中定义了CMTime数据类型作为时间的格式,类型定义如下:

   typedef struct
   
     CMTimeValue    value;      
     CMTimeScale    timescale;  
     CMTimeFlags    flags;      
     CMTimeEpoch    epoch;      
   } CMTime;

显然,CMTime定义是一个C语言的结构体,CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。

CMTime的创建

我们一般使用CMTimeMake函数创建,如下:

    CMTime t1 = CMTimeMake(3, 1);
    CMTime t2 = CMTimeMake(6, 3);

我们也可以通过CMTimeShow函数打印CMTime的相关信息如:

    CMTimeShow(t1);
    CMTimeShow(t2);

结果如:
{3/1 = 3.000}
{6/3 = 2.000}

CMTime计算

相加

 CMTime t3 = CMTimeAdd(t1, t2);

想减

CMTime t4 = CMTimeSubtract(t3, t1);

我们也可以通过CMTimeGetSeconds函数获取时间的秒数。

CMTimeRange

CMTimeRange是一个表示时间范围的一个数据类型,定义如下:

typedef struct
{
    CMTime          start;      
    CMTime          duration;   
} CMTimeRange;

其中start表示时间的起点,duratin表示时间范围的持续时间。
一般使用CMTimeRangeMake和CMTimeRangeFromTimeToTime创建如:

 CMTimeRange timeRange1 = CMTimeRangeMake(t1, t2);
    
 CMTimeRange timeRange2 = CMTimeRangeFromTimeToTime(t4, t3);

CMTimeRange的交集和并集

有时候我们需要获取两个时间范围的交叉时间范围或者两个时间范围的总和时间范围。

交叉时间范围

CMTimeRange intersectionRange = CMTimeRangeGetIntersection(timeRange2, timeRange1);

总和时间范围

CMTimeRange unionRange = CMTimeRangeGetUnion(timeRange1, timeRange2);

CMTime一般用的不多,但是在时间精度有要求的应用中会用到,比如音频,视频的处理。

移动开发
Web note ad 1