ios - 如何在 CMTimeMake 的时间刻度 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 这样的浮点值时,然后:
let 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”)和“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
修改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)
推荐阅读
- python - 无法在 powershell [Errno 22] 中运行带有 txt 条目的 python 脚本
- vue.js - 如何在 VueJS 2 中指定外部图像存储位置?
- android - 片段 OnResume 不更新微调器
- msbuild - 从另一个程序调用时,Msbuild 无法指定配置
- ios - 使用 Codable 从 2 个不同的 JSON 文件中实例化单个类,而不使用可选项
- angular - 如何以角度的一种形式(反应形式)编写多个验证器函数?
- android - ConstraintLayout margin_top 不起作用?
- c# - 读取多行并在空间 c# 控制台应用程序上拆分
- android - xml-Icons 显示为白色,带有 apilvl 24&25
- c# - 试图在 C# 中检索 Mysql 数据库中的图像,但 mysql 显示错误“参数无效”