繁体   English   中英

如何在CMTimeMake的时标Int32中传递Float

[英]How to pass Float in CMTimeMake's timescale Int32

我正在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)

现在,按照我的要求,有一个滑块(0.1到2.0之间),用户可以在其中为慢速和快速效果选择特定的视频比例值。 此值即将浮现。

我的问题是当我在上面的代码中传递诸如0.8的Float值时,则:

让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'(aka'Int64')和'Float'的操作数

确实,在Swift中,您无法像这样操纵各种类型的Int / Float等。

所以要解决它:

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相乘/ 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)

现在应该可以了。

但是我不能离开那个代码。 您的行很长,很难阅读。 实际上,您只需修改CMTimeMake(_:_:)value参数。

让我们分解:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM