Вы написали:
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)
person
Larme
schedule
03.08.2018
videoScaleFactor
, используйтеFloat
. - person Larme   schedule 03.08.2018CMTimeMake(_:_:)
ожидает Int64, то Int32. Что вам нужно сделатьCMTimeMake(Int64(videoAsset.duration.value / videoScaleFactor), ...)
и т. д., гдеvideoScaleFactor
— этоFloat
. Другими словами, используйте Float/Double или другие для вычисления, но затем конвертируйте в Int64. - person Larme   schedule 03.08.2018videoAsset.duration.value
- это Int64. Затем сделайтеCMTimeMake(Int64(Float(videoAsset.duration.value) / videoScaleFactor),...
- person Larme   schedule 03.08.2018