首页 文章

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

提问于
浏览
-1

我在几秒钟内获得当前的游戏 Value ,但我需要几毫秒 . 我试过currentTime.value / currentTime.scale . 但它并没有得到确切的 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];

1 回答

  • 2

    好吧,首先,你想要的 Value 是millisecond而不是秒

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

    用于CMTime计算使用CMTime方法
    CMTimeMultiplyByRatio(<#CMTime time#>,<#int32_t multiplier#>,<#int32_t divisor#>)
    这样做 - > 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
    

相关问题