在音视频开发中时间是十分重要的。媒体文件的元数据是十分庞大的,一个简单的简短的音频文件它的元数据都十分的大。在对一些高级时基媒体开发中,时间是十分必要的。NSTimeInterval是一个简单的双精度类型,可以表示不同场景中的时间。但是在高级的时基媒体开发中一个单一的舍入就有可能造成丢帧或者音频丢失的情况。苹果公式使用Core Media框架定义的了CMtime类型的作为时间格式,然后我们简单了解下,毕竟对于音视频类开发,时间非常重要。
一、CMTime
a、结构
typedef struct
{
CMTimeValue value;
CMTimeScale timescale;
CMTimeFlags flags;
CMTimeEpoch epoch;
}CMTime;
CMTime实例可用于标记特定的时间点或表示持续时间。结构体中最相关的三个东西是value,timescale和flags。CMTimeValue和CMTimeScale是我们定义时间的分母和分子,它们两个的商作为一个时间数。前者是一个64位的有符号整形变量,后者是一个32位的有符号整形变量。CMTimeFlags是一个位掩码,用于表示时间的指定的状态,比如判断数据是够有效,出现舍入,是否有不确定性。
b、创建和运算
最常见的实例创建方式是使用CMTimeMake函数。输入一个64位的value参数和一个32位的timescale参数。如下一个表示5秒的:
CMTime time1 = CMTimeMake(5,1);
CMTime也提供有关时间计算的函数。常用到的有时间相加和时间相减。
CMTime time1 = CMTimeMake(5,1);
CMTime time2 = CmtimeMake(10,1);
相加:
CMTime add = CMTimeAdd (time1,time2);
CMTimeShow(add);
就等同于 CMTime add = CMTimeMake(15,1);
相减:
CMTime sub = CMTimeSubtract (time1,time2);就等同于CMTime sub = CMTimeMake(5,1);
同时我们亦可以使用嵌套去创建新的值
CMTime time2 = CmtimeMake(time1.value,time1.timescale/10);等等此种方式
二、CMTimeRange
一、构造和创建
typedef struct
{
CMTime start;
CMTime duration;
} CMTimeRange;
CMTimeRange是由两个CMTime类型组成的时间类型。start用来表示开始的时间,duration用来表示持续时间。所以创建它的时候就需要两个CMTime类型的实例,在此也就不过多累赘,经常用的有CMTimeRangeMake和CMTimeRangeTimeTimeToTime,两个创建函数。
二、运算
经常用到交叉范围和总和
CMTime cusorTime = kCMTimeZero;
CMTime videoDuration = CMTimeMake(5, 1);
CMTimeRange videoTimeRangee = CMTimeRangeMake(kCMTimeZero, videoDuration);
CMTimeRange range2 = CMTimeRangeMake(CMTimeMake(3, 1), CMTimeMake(15, 1));
CMTimeRange intersection = CMTimeRangeGetIntersection(videoTimeRangee, range2);//相交范围
CMTimeRangeShow(intersection);
CMTimeRange unionRange = CMTimeRangeGetUnion(videoTimeRangee, range2); //总范围
CMTimeRangeShow(unionRange);
打印结果为
intersection为{{3/1 = 3.000}, {2/1 = 2.000}}
unionRange为{{0/1 = 0.000}, {18/1 = 18.000}}