我正在创建一个应用程序,需要混合歌曲。我已经完成了这个过程,但问题是当我使用以下函数时。
- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError **)error;
我需要在atTime
参数中传递CMTime
类型的值,但它不接受浮点数值,并且我需要在某个浮点数值上添加另一首歌。有可能吗?
我正在创建一个应用程序,需要混合歌曲。我已经完成了这个过程,但问题是当我使用以下函数时。
- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError **)error;
我需要在atTime
参数中传递CMTime
类型的值,但它不接受浮点数值,并且我需要在某个浮点数值上添加另一首歌。有可能吗?
您可以使用其中一个CMTimeMake...()
functions。您需要提供时间点和时间刻度值。前者是一个64位整数;您可以将您的float
截断或四舍五入以将其转换为整数,或者使用必要的高时间刻度:
CMTime tm = CMTimeMake(53425, 10000); // @ 5.3425 sec
In Swift 4.2 and Xcode 10.1
CMTimeMake(value: 53425, timescale: 10000)// @ 5.3425 sec
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+
还可以查看苹果文档。
不幸的是,每个答案都使用硬编码的CMTimeScale(1000)
,正确的方法是
let t = CMTimeMake(value: 53425, timescale: CMTimeScale(NSEC_PER_SEC))
CMTimeMake(53425, 10000)
... - user529758CMTimeMake(5.3425, 1.0)
失败了,因为timescale
值意味着CMTimeMake
不会返回小于 1 秒的任何内容。整个 CMTime 对象的精度受此数量限制。例如,如果 timescale 是 1,则对象无法表示小于 1 秒的时间戳,并且时间戳以一秒的增量递增。同样,如果 timescale 是 1000,则每秒被细分为 1000 份,而值成员表示我们要表示的毫秒数。详情请参见:https://warrenmoore.net/understanding-cmtime - Crashalot