Deepak Chaudhary Deepak Chaudhary - 4 months ago 121
iOS Question

How do I get current playing time, CMTime in milliseconds in AVPlayer?

I am getting current playing value in seconds but i need in milliseconds. I tried to currentTime.value/currentTime.scale. But it didn't get exact value.

CMTime currentTime = vPlayer.currentItem.currentTime; //playing time
CMTimeValue tValue=currentTime.value;
CMTimeScale tScale=currentTime.timescale;

NSTimeInterval time = CMTimeGetSeconds(currentTime);
NSLog(@"Time :%f",time);//This is in seconds, it misses decimal value double shot=(float)tValue/(float)tScale;
shotTimeVideo=[NSString stringWithFormat:@"%.2f",(float)tValue/(float)tScale];

CMTime currentTime = vPlayer.currentItem.currentTime; //playing time
CMTimeValue tValue=currentTime.value;
CMTimeScale tScale=currentTime.timescale;

NSTimeInterval time = CMTimeGetSeconds(currentTime);
NSLog(@"Time :%f",time);//This is in seconds, it misses decimal value
double shot=(float)tValue/(float)tScale;
shotTimeVideo=[NSString stringWithFormat:@"%.2f", (float)tValue/(float)tScale];

Answer

okay,first of all, the value you want is millisecond not seconds

So,you can just use CMTimeGetSeconds(<#CMTime time#>) to get Seconds
then,if you want millisecond , use seconds / 1000.f for float or double value

for CMTime calculating use CMTime method
CMTimeMultiplyByRatio(<#CMTime time#>, <#int32_t multiplier#>, <#int32_t divisor#>)
just do this --> CMTimeMultiplyByRatio(yourCMTimeValue, 1, 1000)

Apple's Doc

@function   CMTimeMultiplyByRatio
@abstract   Returns the result of multiplying a CMTime by an integer, then dividing by another integer.
@discussion The exact rational value will be preserved, if possible without overflow.  If an overflow
            would occur, a new timescale will be chosen so as to minimize the rounding error.
            Default rounding will be applied when converting the result to this timescale.  If the
            result value still overflows when timescale == 1, then the result will be either positive
            or negative infinity, depending on the direction of the overflow.

            If any rounding occurs for any reason, the result's kCMTimeFlags_HasBeenRounded flag will be
            set.  This flag will also be set if the CMTime operand has kCMTimeFlags_HasBeenRounded set.

            If the denominator, and either the time or the numerator, are zero, the result will be
            kCMTimeInvalid.  If only the denominator is zero, the result will be either kCMTimePositiveInfinity
            or kCMTimeNegativeInfinity, depending on the signs of the other arguments.

            If time is invalid, the result will be invalid. If time is infinite, the result will be
            similarly infinite. If time is indefinite, the result will be indefinite.                               


@result     (time * multiplier) / divisor
Comments