我以快和慢动作效果添加到视频工作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成这样? 请建议我。
你写了:
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)