Cri*_*682 0 iphone avfoundation core-media ios avmutablecomposition
我正在编写一个使用AVFoundation和CMTime的应用程序.我已经记录了CMTime使用创建的实例的值CMTimeMake().此值似乎四舍五入到最接近的整数.我需要一个CMTime具有精确值的实例,而不需要舍入.
我在CMTime参考文献中看到了舍入常量:
enum {
kCMTimeRoundingMethod_RoundHalfAwayFromZero = 1,
kCMTimeRoundingMethod_RoundTowardZero = 2,
kCMTimeRoundingMethod_RoundAwayFromZero = 3,
kCMTimeRoundingMethod_QuickTime = 4,
kCMTimeRoundingMethod_RoundTowardPositiveInfinity = 5,
kCMTimeRoundingMethod_RoundTowardNegativeInfinity = 6,
kCMTimeRoundingMethod_Default = kCMTimeRoundingMethod_RoundHalfAwayFromZero
};
Run Code Online (Sandbox Code Playgroud)
没有任何关于如何控制这些策略应用于CMTime实例的示例?或者,如果这不是正确的方法,我如何从CMTime实例中提取精确值?
编辑:
我找到并测试过了CMTIME_HAS_BEEN_ROUNDED().我将我的CMTime实例传递给了这个函数并返回No(表示该值尚未舍入).那为什么我会失去精确度呢?
如果您阅读文档,CMTime您将看到它使用分子和分母将时间存储为有理数.分子是int64_t分母int32_t.
分子指定已经过了多少"滴答",分母指定每秒有多少"滴答".
所以0.5秒可以存储为:
等等.你做的方式,使用
CMTimeMake([[Array objectAtIndex:i]floatValue], 1);
Run Code Online (Sandbox Code Playgroud)
是说"每秒有一个刻度",并且由于分子是一个整数,因此浮点值被截断,因此只存储1.因此,您将时间指定为:1/1,已经过了一个刻度,每秒一个刻度,因此您实际上只存储了 1秒.
要解决这个问题,这取决于你想做什么以及你是否关心时间表.Apple建议使用600的时间刻度,但如果你不在乎,你可以这样做:
CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);
Run Code Online (Sandbox Code Playgroud)
这将时间刻度设置为1000,因此每秒1000个刻度,因此每个刻度1毫秒.它还将时间(以秒为单位)转换为毫秒.请注意,它会截断第4位数,所以如果你有1.2345,那么你得到1.234而不是1.235.如果这对你很重要,请参阅roundf.
| 归档时间: |
|
| 查看次数: |
2066 次 |
| 最近记录: |