CMTime简单介绍

Posted 博BOBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMTime简单介绍相关的知识,希望对你有一定的参考价值。

通常开发者认为时间的呈现格式应该是浮点数据,我们一般使用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是一个表示时间范围的一个数据类型,定义如下:

 

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


CMTimeRange timeRange1 = CMTimeRangeMake(t1, t2);


CMTimeRange timeRange2 = CMTimeRangeFromTimeToTime(t4, t3);
  1.  

CMTimeRange的交集和并集

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

交叉时间范围

CMTimeRange intersectionRange = CMTimeRangeGetIntersection(timeRange2, timeRange1);

总和时间范围

CMTimeRange unionRange = CMTimeRangeGetUnion(timeRange1, timeRange2);

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

 

以上是关于CMTime简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSTimeInterval 进行 CMTime 引用

试图了解CMTime

尝试将 CMTime 存储为 Core Data 上的可转换属性

试图理解 CMTime 和 CMTimeMake

从 NStimeInterval 准确转换为 CMTime

AVQueuePlayer seek(to:) 和 CMTime 的问题