如何通过漂浮在CMTimeMake的时间尺度的Int32(How to pass Float in

2019-10-28 14:30发布

我以快和慢动作效果添加到视频工作CMTimeMake。 在这里我们通过视频对规模效应的快速分裂,并通过视频刻度减速效果倍增。

这里是:

let videoScaleFactor = Int64(2)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(videoAsset.duration.value / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(videoAsset.duration.value * videoScaleFactor, videoAsset.duration.timescale)

现在按照我的要求,有一个滑块(〜2.0至0.1之间),其中用户将选择用于慢速和快速作用的特定视频比例值。 该值在浮来了。

我的问题是,当我路过像0.8我浮点值在我上面的代码中,则:

让videoScaleFactor = Int64类型(0.8)//此返回我0

我怎样才能返回精确值0.8成这样? 请建议我。

Answer 1:

你写了:

let videoScaleFactor = Int64(0.8) // this returns me 0

这是正常的,因为按照定义,不能有十进制值。 所以0.8 => 0。

相反,使用Float (或Double取决于你所需要的精度)。

因此,让我们试试吧:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(videoAsset.duration.value / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(videoAsset.duration.value * videoScaleFactor, videoAsset.duration.timescale)

这上升的另一个问题:

二进制运算符“/”不能被施加到型“CMTimeValue”(又名“的Int64”)和“浮动”的操作数

事实上,在斯威夫特你不能操纵各类Int的/浮动等这样的。

因此,要解决这个问题:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(Float(videoAsset.duration.value) / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(Float(videoAsset.duration.value) * videoScaleFactor, videoAsset.duration.timescale)

现在你乘/除Float与其他Float

func CMTimeMake(_ value: Int64, _ timescale: Int32) -> CMTime

所以CMTimeMake(_:_:)等待一个Int64值,所以你是因为得到一个错误Float(videoAsset.duration.value) / videoScaleFactor (对于第一个)返回一个Float ,而方法想要一个Int64。

所以只是做

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(Int64(Float(videoAsset.duration.value) / videoScaleFactor), videoAsset.duration.timescale) : CMTimeMake(Int64(Float(videoAsset.duration.value) * videoScaleFactor), videoAsset.duration.timescale)

这应该现在的工作。

但我不能与该代码离开。 你的线很长,很难阅读。 其实,你只需要修改value的PARAM CMTimeMake(_:_:)

让我们因式分解:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = CMTimeMake((mode == .Faster) ? Int64(Float(videoAsset.duration.value) / videoScaleFactor) : Int64(Float(videoAsset.duration.value) * videoScaleFactor), videoAsset.duration.timescale)

现在,它是个人的,由我宁愿(没有错,一个额外的行明确):

let videoScaleFactor = Float(0.8) 
let value = (mode == .Faster) ? Float(videoAsset.duration.value) / videoScaleFactor : Float(videoAsset.duration.value) * videoScaleFactor 
let scaledVideoDuration = CMTimeMake(Int64(value), videoAsset.duration.timescale)


文章来源: How to pass Float in CMTimeMake's timescale Int32