今天给各位分享深入解析 CMTime 的概念与用法的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
如果我们想表示视频文件中的某个时刻,比如35:06,我们可能会用双精度浮点数来表示,比如:
NSTimeInterval t=2106.0。这在大多数情况下是正确的,但当我们想要非常仔细地划分时间时,它就不起作用了。在我所知的大多数平台上( sizeof(NSTimeInterval)==sizeof(Float64)==sizeof(double)==8 ),浮点数(例如double)只能大致表示小数点后16 位数字。
浮点数在某些时候重复运算(如加、减、乘、除等)时可能会遇到一些问题。例如,经过一系列操作后,浮点数表示的时间可能与准确时间有显着差异,这可能会导致多媒体同步出现问题。流式传输时发生一些错误。
例如,如果将一百万加上0.0000001,结果可能会变为1.0000000000079181。出现这个问题的原因是浮点数无法准确表示10的-6次方。这个错误并不那么明显,但是如果您在HTTP 流中每秒运行数千次,仍然可能会出现错误。
这导致我们必须废除以前的浮点计数方法并找到一种新的方法来准确地表示时间。
将时间看作有理数
Mac 和iOS 平台上有许多数据结构来表示时间。在iOS4和Mac OSX 10.7中,Apple引入了新的数据格式:CMTime和CMTimeRange。如果你了解了CMTime,那么你自然也就了解了CMTimeRange,所以我们不讨论后者。
CMTime 是一个具有4 个成员的C 函数结构。
typedef struct { CMTimeValue 值; CMTimeScale 时间刻度; CMTimeFlags 标志; CMTimeEpoch 纪元; CMTime;
在本节中,我们将重点关注价值和时间尺度。 Flags也是一个重要的成员,我们稍后会提到。 flags的各种值将代表时间戳的正无穷大或负无穷大,或者已经作为中间计算的结果。这样的数据结构显然比浮点数具有更强的表达能力,并且具有很多优点。
我们想一下CMTime是如何表示时间的。我们需要知道value 和timescale 都是64 位或32 位整数。通过前面浮点数的例子,我们可以知道为什么值存储为整数。对于每个时间尺度值,我们可以用64位和19位小数精确地表示900亿个正值。
时间刻度代表什么?表示1秒时间分为多少部分。因为整个CMTime的精度都是由它来控制的,所以显得尤为重要。例如,当timescale为1时,CMTime不能表示小于1秒的时间和增加1秒。同样,当时间刻度为1000时,每一秒被分为1000份,CMTime的值代表毫秒数。
如何选择合适的时间尺度?苹果对视频的建议是timescale=600,因为600是常见视频每秒帧数(24、25、30FPS)的公倍数。如果是音频,则可以使用60,000 或更高的时间刻度。使用64位整数值,仍然可以表示580万年内每增加1/60,000,这是非常准确的。
这种方式的时间戳就是t.value/t.timescale。您可以使用CMTimeGetSeconds 将CMTime 准确转换为
浮点64。
不是很方便的便利方法
CMTimeGetSeconds 可能很有用,但它有两个方面。 CMTimeMakeWithSeconds 对新手不友好,该方法的风格如下:
CMTime CMTimeMakeWithSeconds ( Float64 秒, int32_t PreferredTimeScale );
当我第一次使用它时,它没有达到我的预期。现在我们已经了解了CMTime 的所有内部结构,我希望您能看到我哪里出错了。我想代表0.5秒,这样我就可以每0.5秒收到AVPlayer播放MP3的回调,我使用这样的方法:
CMTime 间隔=CMTimeMakeWithSeconds(0.5, 1);
如果你仔细查看,你应该能够看出间隔实际上是0,而不是0.5。用整数来表示半整数显然没有意义,但我们确实需要这样做。我们的值大约等于0,因为我们的时间尺度不够精确。
Core Media 的API 包括CMTime 构造、比较和算术运算。虽然使用CMTime进行算术运算比较复杂,但是想要精确计算就需要这样做。每个方法都执行值溢出检测和舍入,并将CMTime 标志设置为适当的值。
使用CMTimeAdd添加两个CMTime;使用CMTimeCompare比较两次(该方法的返回值可以使用C语言注释库中的qsort进行比较);求两个时间中较大的值。您可以使用CMTimeMaximum。阅读文档以找到更全面的方法。
无限大:设置flag
最后一段是CMTime,代表无穷大、模糊值和舍入。模糊值是指其值是未知的。当你访问一个尚未创建的对象的时间时,你可能会得到这样的时间戳。可以将flags的值与以下值进行比较来确定异常:何时发生:
kCMTimeFlags_PositiveInfinitykCMTimeFlags_NegativeInfinitykCMTimeFlags_Indefinite 不是每个人都喜欢按位或运算,苹果给出了一些宏来表示这些标志:
CMTIME_IS_POSITIVE_INFINITYCMTIME_IS_NEGATIVE_INFINITYCMTIME_IS_INDEFINITE 这些宏可以确保这些时间是有问题的或合法的。如果不合法,则返回NO。
-以下是一些比较不同类别时间的列表:
-无效时间和无效时间相等且大于其他时间;
-正无穷时间小于非法时间,等于自身,大于其他时间;
- 模糊时间小于非法时间、小于正无限时间、等于自身、大于其他时间;
- 负无穷时间比其他时间小并且等于自身;
用途
我没有时间详细讨论CMTime在你的项目中的实际使用情况。不过看完这篇文章,你应该对CMTime有了一定的了解。 AVFoudation库中有很多类(如:AVPlayer、AVAssetReader)使用CMTime来表示时间。
【深入解析 CMTime 的概念与用法】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于明白为什么我的视频播放时间总是搞错啦!
有9位网友表示赞同!
这篇文章讲的好像很专业啊,有没有科普版的?
有20位网友表示赞同!
之前也没太听懂CMTime是什么东西,看完这个标题感觉更有兴趣了~
有15位网友表示赞同!
想学习一下视频编辑相关的知识,这个应该很基础吧?
有15位网友表示赞同!
希望这篇文章能用通俗易懂的方法解释,我有点怕看不懂啊。
有11位网友表示赞同!
视频开发和CMTime关系很大吗?感觉有些新奇!
有19位网友表示赞同!
学习一下视频时间管理的感觉蛮不错的,也许能帮助到我的项目呢!
有17位网友表示赞同!
这篇文章是不是跟苹果的产品有关?
有11位网友表示赞同!
最近在做相关项目,这篇文章正好可以参考下!
有14位网友表示赞同!
感觉CMTime听起来很高大上的东西...希望文章能解释清楚!
有8位网友表示赞同!
我已经看到了不少关于CMTime的文章了,但还是会有很多疑问。希望能找到合适的答案!
有5位网友表示赞同!
学习新的知识总是一个很好的选择!期待这篇文章能让我对CMTime有个更清晰的理解!
有13位网友表示赞同!
对编程和视频开发都有兴趣的人可以关注一下这个话题吧!
有9位网友表示赞同!
希望这篇文章能够比较深入地讲解CMTime,而不是只停留在表面.
有8位网友表示赞同!
想了解CMTime主要应用在哪方面?这篇文章能给我一些启发吗?
有14位网友表示赞同!
文章讲的太专业了,还是让我有点消化不过来... 希望有更简化的介绍!
有16位网友表示赞同!
学习理解CM的时间和方法! 期待这个教程能提供一些实际的操作步骤.
有17位网友表示赞同!
了解CMTime对视频剪辑来说有多么重要,这篇文章应该会有详细的解释吧?
有11位网友表示赞同!