I have a small integer value and I want to convert it into CMTime.
The problem is that
CMTime(value: _ , timeScale: _)
or
CMTimeMakeWithSeconds(value: _ , timeScale: _)
will always return the floor so that time always equals 0.0 seconds
let smallValue = 0.0401588716
let frameTime = CMTime(Int64(smallValue) , timeScale: 1)
//frameTime is 0.0 seconds because of Int64 conversion
let frameTimeInSeconds = CMTimeMakeWithSeconds(smallValue , timeScale: 1)
// frameTimeInSeconds also returns 0.0 seconds.
CMTime
represents a time value as a rational number with integer
numerator (the value
) and denominator (the timescale
) . In order to represent a small value
like yours, you have to choose a larger timescale (depending on
the desired accuracy). Example:
let smallValue = 0.0401588716
let frameTime = CMTime(seconds: smallValue, preferredTimescale: 1000000)
print(frameTime.seconds) // 0.040158
I should have put a little thought into it before posting the question.
let smallValue = 0.0401588716
let oneSec = CMTimeMakeWithSeconds(1, timeScale: 1)
let frameTime = CMTimeMultiplyByFloat64(oneSec , smallValue)
print(CMTimeGetSeconds(frameTime)) // 0.040158872