如何在 AVPlayer 中获取当前播放时间,以毫秒为单位的 CMTime?

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

我正在以秒为单位获取当前播放值,但我需要以毫秒为单位。我试过 currentTime.value/currentTime.scale。但是没有得到准确的值。

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];

好的,首先你要的值是millisecond不是秒

所以,你可以只使用 CMTimeGetSeconds(<#CMTime time#>) 来获得秒数
然后,如果你想要毫秒,使用秒数 / 1000.f 表示浮点数或双精度值

CMTime计算使用CMTime方法
CMTimeMultiplyByRatio(<#CMTime time#>, <#int32_t multiplier#>, <#int32_t divisor#>)
只需这样做 --> CMTimeMultiplyByRatio(yourCMTimeValue, 1, 1000)

苹果文档

@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

有点晚了,但可能对其他人有用。 您可以通过

从 CMTime 对象中获取以毫秒为单位的时间戳
CMTimeConvertScale(yourCMTime, timescale:1000, method:
    CMTimeRoundingMethod.roundHalfAwayFromZero

一个例子:

var yourtime:CMTime = CMTimeMake(value:1234567, timescale: 10)
var timemilli:CMTime = CMTimeConvertScale(yourtime, timescale:1000, method:
    CMTimeRoundingMethod.roundHalfAwayFromZero)
var timemillival:Int64 = timemilli.value
print("timemilli \(timemillival)")

这将产生

timemilli 123456700