Objective-C/CMTime - 将AVPlayer.duration转换为毫秒

19

我正在创建一个播放铃声的应用程序,并且希望每次播放铃声时知道当前时间的毫秒数。

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

这里的currentTime获得的值是以秒为单位的。 如何获得确切的以毫秒为单位的currentTime值?

3个回答

59

有一种方法可以获取当前时间的秒数,你可以将其乘以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作为参数。
- Developer
您可以使用原始时间(以秒为单位),并使用CMTimeMake函数创建具有该值的CMTime。 - Samssonart
这个十年前的答案仍经受住了时间的考验。非常感谢。它帮助我们解决了一个问题,即在此PR中失去了一部分秒数。 - om-ha

6

我认为被接受的答案缺乏细节。获取毫秒的更准确方法如下:

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

如果首先将其转换为秒,则会失去精度。

1
这是不正确的。根据苹果关于CMTimeGetSeconds的文档,“除法是在Float64中完成的,因此分数在返回结果中不会丢失。” - amergin

2

CMTime.value和CMTime.timescale都是整数,所以根据你的代码,结果会被四舍五入,你无法得到精确的时间戳。尝试使用CMTimeGetSeconds代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接