CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime
typedef struct
{
CMTimeValue value; /*! @field value The value of the CMTime. value/timescale = seconds. */
CMTimeScale timescale; /*! @field timescale The timescale of the CMTime. value/timescale = seconds. */
CMTimeFlags flags; /*! @field flags The flags, eg. kCMTimeFlags_Valid, kCMTimeFlags_PositiveInfinity, etc. */
CMTimeEpoch epoch; /*! @field epoch Differentiates between equal timestamps that are actually different because
of looping, multi-item sequencing, etc.
Will be used during comparison: greater epochs happen after lesser ones.
Additions/subtraction is only possible within a single epoch,
however, since epoch length may be unknown/variable. */
} CMTime;
CMTime定义是一个C语言的结构体,CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。
他有两个构造函数:
CMTimeMake
CMTime CMTimeMake(
int64_t value, /*! @param value Initializes the value field of the resulting CMTime. */
int32_t timescale) /*! @param timescale Initializes the timescale field of the resulting CMTime. */
__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
value当前第几帧,timescale每秒钟多少帧.当前播放时间a/b
int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);
OUTPUT: {10000/600 = 16.667}
代表时间为16.667s, 视频一共1000帧,每秒600帧
CMTimeMakeWithSeconds
CMTime CMTimeMakeWithSeconds(
Float64 seconds,
int32_t preferredTimescale)
__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);
seconds当前时间,preferredTimescale每秒钟多少帧.
Float64 seconds = 5;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);
OUTPUT: {3000/600 = 5.000}
代表当前时间为5s,视频一共有3000帧,一秒钟600帧
demo——拖动进度条:
float minValue = [slider minimumValue];
float maxValue = [slider maximumValue];
float value = [slider value];
seconds = duration * (value - minValue) / (maxValue - minValue);
preferredTimeScale = 1 *NSEC_PER_SEC;
1 *NSEC_PER_SEC 如果只写 1 的话有很大的误差,使用纳秒也是为了保证指定一个时间播放视频的精确度timescale可能就是 1 preferredTimeScale的精确度就更高 1 * NSEC_PER_SEC
关键词解释:
- NSEC:纳秒。
- USEC:微妙。
- SEC:秒
- PER:每
所以:
- NSEC_PER_SEC,每秒有多少纳秒。
- USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)
- NSEC_PER_USEC,每毫秒有多少纳秒。
1秒可以写成如下几种:
- 1 * NSEC_PER_SEC
- 1000 * USEC_PER_SEC
- USEC_PER_SEC * NSEC_PER_USEC
打印:
CMTimeShow(CMTime)//打印CMTime
相加:
CMTime t3 = CMTimeAdd(t1, t2);
相减:
CMTime t4 = CMTimeSubtract(t3, t1);
函数获取时间的秒数:
CMTimeGetSeconds(t1)
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);