You should be construction your CMTime
like so:
CMTimeMake(1, numberOfFrames);
A CMTime is represented as a rational number, with a numerator (an int64_t value), and a denominator (an int32_t timescale). Conceptually, the timescale specifies the fraction of a second each unit in the numerator occupies. Thus if the timescale is 4, each unit represents a quarter of a second; if the timescale is 10, each unit represents a tenth of a second, and so on.
Your call CMTimeMakeWithSeconds
adds kCMTimeFlags_HasBeenRounded
to CMTime
. Thats why it will round to the nearest full second.