我正在研究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)
现在按照我的要求,有一个Slider(介于0.1到2.0之间),用户可以在其中为Slow和Fast效果选择特定的视频比例值。此值即将浮空。
我的问题是,当我在上面的代码中传递诸如0.8的Float值时,然后:
let videoScaleFactor = Int64(0.8)//这将返回0
如何向其中返回精确值0.8?请告诉我。
答案 0 :(得分:0)
您写道:
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
相乘/除
但是
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
的{{1}}参数。
让我们分解:
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)