通常開發(fā)者認(rèn)為時(shí)間的呈現(xiàn)格式應(yīng)該是浮點(diǎn)數(shù)據(jù),我們一般使用NSTimeInterval,實(shí)際上它是簡單的雙精度double類型,只是typedef了一下,但是由于浮點(diǎn)型數(shù)據(jù)計(jì)算很容易導(dǎo)致精度的丟失,在一些要求高精度的應(yīng)用場景顯然不適合,于是蘋果在Core Media框架中定義了CMTime數(shù)據(jù)類型作為時(shí)間的格式,類型定義如下:
typedef struct
CMTimeValue value;
CMTimeScale timescale;
CMTimeFlags flags;
CMTimeEpoch epoch; } CMTime;
顯然,CMTime定義是一個(gè)C語言的結(jié)構(gòu)體,CMTime是以分?jǐn)?shù)的形式表示時(shí)間,value表示分子,timescale表示分母,flags是位掩碼,表示時(shí)間的指定狀態(tài)。
CMTime的創(chuàng)建
我們一般使用CMTimeMake函數(shù)創(chuàng)建,如下:
CMTime t1 = CMTimeMake(3, 1);
CMTime t2 = CMTimeMake(6, 3);
我們也可以通過CMTimeShow函數(shù)打印CMTime的相關(guān)信息如:
CMTimeShow(t1); CMTimeShow(t2);
結(jié)果如:{3/1 = 3.000}{6/3 = 2.000}
CMTime計(jì)算
相加
CMTime t3 = CMTimeAdd(t1, t2);
想減
CMTime t4 = CMTimeSubtract(t3, t1);
我們也可以通過CMTimeGetSeconds函數(shù)獲取時(shí)間的秒數(shù)。
CMTimeRange
CMTimeRange是一個(gè)表示時(shí)間范圍的一個(gè)數(shù)據(jù)類型,定義如下:
typedef struct{
CMTime start; CMTime duration;
} CMTimeRange;
其中start表示時(shí)間的起點(diǎn),duratin表示時(shí)間范圍的持續(xù)時(shí)間。一般使用CMTimeRangeMake和CMTimeRangeFromTimeToTime創(chuàng)建如:
CMTimeRange timeRange1 = CMTimeRangeMake(t1, t2);
CMTimeRange timeRange2 = CMTimeRangeFromTimeToTime(t4, t3);
CMTimeRange的交集和并集
有時(shí)候我們需要獲取兩個(gè)時(shí)間范圍的交叉時(shí)間范圍或者兩個(gè)時(shí)間范圍的總和時(shí)間范圍。
交叉時(shí)間范圍
CMTimeRange intersectionRange = CMTimeRangeGetIntersection(timeRange2, timeRange1);
總和時(shí)間范圍
CMTimeRange unionRange = CMTimeRangeGetUnion(timeRange1, timeRange2);
CMTime一般用的不多,但是在時(shí)間精度有要求的應(yīng)用中會(huì)用到,比如音頻,視頻的處理。