gpt4 book ai didi

ios - 将 CMTimeRange 拆分为多个 CMTimeRange block

转载 作者:可可西里 更新时间:2023-11-01 01:09:23 25 4
gpt4 key购买 nike

假设我有一个从 start time 零构造的 CMTimeRange,并且 持续时间 40 秒。

我想通过 X 秒分隔符将此 CMTimeRange 分成多个 block 。所以 block 的总持续时间将与原始持续时间相同duration,并且每个startTime将反射(reflect)endTime 。最后一个 block 将是剩余秒数的模数

例如,对于 40 秒的视频和每个 block 15 秒的分隔符:

  1. 第一个 CMTimeRange - 开始时间:0,持续时间:15 秒。
  2. 第二个 CMTimeRange - 开始时间:15,持续时间:15 秒。
  3. 第三个 CMTimeRange - 开始时间:30,持续时间:10 秒。 (剩下的)

我尝试过的:

我尝试对总持续时间使用 CMTimeSubtract 并再次使用结果,以递归方式直到 CMTime 无效,但它似乎不起作用。

我们将不胜感激任何帮助。

最好的问候,Roi

最佳答案

range.start 开始,创建给定长度的范围直到到达 range.end:

func splitIntoChunks(range: CMTimeRange, length: CMTime) -> [CMTimeRange] {

var chunks: [CMTimeRange] = []
var from = range.start
while from < range.end {
chunks.append(CMTimeRange(start: from, duration: length).intersection(range))
from = from + length
}

return chunks
}

intersection 用于将最后一个 block 修剪到原始范围。

替代方案:

func splitIntoChunks(range: CMTimeRange, length: CMTime) -> [CMTimeRange] {

return stride(from: range.start.seconds, to: range.end.seconds, by: length.seconds).map {
CMTimeRange(start: CMTime(seconds: $0, preferredTimescale: length.timescale), duration: length)
.intersection(range)
}

}

使用自定义扩展使 CMTime 采用 Strideable协议(protocol)

extension CMTime: Strideable {
public func distance(to other: CMTime) -> TimeInterval {
return other - self
}

public func advanced(by n: TimeInterval) -> CMTime {
return self + n
}
}

这可以进一步简化为

func splitIntoChunks(range: CMTimeRange, length: CMTime) -> [CMTimeRange] {

return stride(from: range.start, to: range.end, by: length.seconds).map {
CMTimeRange(start: $0, duration: length) .intersection(range)
}
}

在任何情况下,您都可能想要添加一张支票

precondition(length.seconds > 0, "length must be positive")

您的函数,以便在开发过程中检测无效调用。

关于ios - 将 CMTimeRange 拆分为多个 CMTimeRange block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com