如何在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 之间),用户将在其中 select 特定的视频缩放值以实现慢速和快速效果。此值以 Float 形式出现。
我的问题是当我在上面的代码中传递像 0.8 这样的 Float 值时,然后:
let videoScaleFactor = Int64(0.8) // this returns me 0
如何 return 将精确值 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)
这引发了另一个问题:
Binary operator '/' cannot be applied to operands of type 'CMTimeValue' (aka 'Int64') and '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)
现在你 multiply/divide 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)
我正在研究 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 之间),用户将在其中 select 特定的视频缩放值以实现慢速和快速效果。此值以 Float 形式出现。
我的问题是当我在上面的代码中传递像 0.8 这样的 Float 值时,然后:
let videoScaleFactor = Int64(0.8) // this returns me 0
如何 return 将精确值 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)
这引发了另一个问题:
Binary operator '/' cannot be applied to operands of type 'CMTimeValue' (aka 'Int64') and '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)
现在你 multiply/divide 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)