CMTime和CMtimeRange

在音视频开发中时间是十分重要的。媒体文件的元数据是十分庞大的,一个简单的简短的音频文件它的元数据都十分的大。在对一些高级时基媒体开发中,时间是十分必要的。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}}

 

转载于:https://my.oschina.net/zhengjianhua/blog/694039

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值