【问题标题】:objectiveC/CMTime - convert AVPlayer.duration to millisecondsObjectiveC/CMTime - 将 AVPlayer.duration 转换为毫秒
【发布时间】:2023-03-28 17:06:01
【问题描述】:

我正在创建一个播放铃声的应用,我想知道每次播放铃声的当前时间(以毫秒为单位)。

CMTime cTime = player_.currentTime; float currentTime = cTime.value / cTime.timescale;

这里的 currentTime 以秒为单位获取值。 如何获得准确的 currentTime 值,但以毫秒为单位?

【问题讨论】:

    标签: iphone avfoundation avplayer cmtime


    【解决方案1】:

    有一种方法可以以秒为单位获取当前时间,您可以将其乘以 1000 倍,然后您就有了毫秒数:

    Float64 dur = CMTimeGetSeconds([player currentTime]);
    Float64 durInMiliSec = 1000*dur;
    

    遗憾的是,您将不得不将其用作floatFloat64,您不能将该结果用作CMTime

    【讨论】:

    • 但是我们如何在下面的函数中传递这个浮点值呢? - (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError **)error;因为它以CMTime为参数。
    • 您可以使用原始时间(以秒为单位)并使用 CMTimeMake 函数创建具有该值的 CMTime。
    • 这个有十年历史的答案仍然经得起时间的考验。非常感激。帮助我们解决了在此 PR 中丢失几分之一秒的问题。
    【解决方案2】:

    我认为接受的答案丢失了细节。获得毫秒的更准确方法如下:

    let seconds : Double = Float64(time.value * 1000) / Float64(time.timescale)
    

    如果您先转换为秒数,则会失去精度。

    【讨论】:

    • 这是不正确的。来自 Apple 关于 CMTimeGetSeconds 的文档“除法是在 Float64 中完成的,因此返回的结果中不会丢失分数。”
    【解决方案3】:

    CMTime.value 和 CMTime.timescale 都是整数,因此根据您的代码判断,结果会四舍五入,并且您没有得到精确的时间戳。请改用 CMTimeGetSeconds。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2013-06-23
      • 2011-02-13
      • 2011-02-14
      相关资源
      最近更新 更多