如何在数据类型为CMTime的情况下传递浮点值?

10

我正在创建一个应用程序,需要混合歌曲。我已经完成了这个过程,但问题是当我使用以下函数时。

- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError **)error;

我需要在atTime参数中传递CMTime类型的值,但它不接受浮点数值,并且我需要在某个浮点数值上添加另一首歌。有可能吗?

4个回答

19

您可以使用其中一个CMTimeMake...()functions。您需要提供时间点和时间刻度值。前者是一个64位整数;您可以将您的float截断或四舍五入以将其转换为整数,或者使用必要的高时间刻度:

CMTime tm = CMTimeMake(53425, 10000); // @ 5.3425 sec

我不需要整数值。这里有一个例子,假设有一首歌曲的持续时间为10秒,我必须在5.3425秒时混合另一首歌曲。但是由于“atTime”参数只接受CMTime值,并且它是整数,当我使用CMTimeMake(5.3425,1.0)时,它会返回5.00000,而歌曲会在5.00000处添加,而不是在5.3425处。 - Developer
@Harsh 为什么你不能将时间刻度设置为合理的值呢?例如,5.3425 可以表示为 CMTimeMake(53425, 10000)... - user529758
1
成功了!:-) 接受了你的答案!谢谢,但为什么使用 CMTimeMake(5.3425, 1.0) 无法工作呢? - Developer
只有当你阅读文档时才能知道...函数的第一个参数是分数的分子,第二个参数是分母。它接受整数,所以无论你有一个浮点数,C的类型系统都会将其截断。 - user529758
@Harsh CMTimeMake(5.3425, 1.0) 失败了,因为 timescale 值意味着 CMTimeMake 不会返回小于 1 秒的任何内容。整个 CMTime 对象的精度受此数量限制。例如,如果 timescale 是 1,则对象无法表示小于 1 秒的时间戳,并且时间戳以一秒的增量递增。同样,如果 timescale 是 1000,则每秒被细分为 1000 份,而值成员表示我们要表示的毫秒数。详情请参见:https://warrenmoore.net/understanding-cmtime - Crashalot

2

In Swift 4.2 and Xcode 10.1

CMTimeMake(value: 53425, timescale: 10000)// @ 5.3425 sec

0

Swift版本

CMTime(seconds: 5.3425, preferredTimescale: CMTimeScale(1000))

preferredTimescale设置为较大值以获得更高的精度。


可用性

iOS 7.0+ macOS 10.9+ Mac Catalyst 13.0+ tvOS 9.0+ watchOS 6.0+ Xcode 7.1+

还可以查看苹果文档


0

不幸的是,每个答案都使用硬编码的CMTimeScale(1000),正确的方法是

let t = CMTimeMake(value: 53425, timescale: CMTimeScale(NSEC_PER_SEC))

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