Я понимаю понятие CMTime
и что оно делает. В двух словах, у нас есть очень маленькие доли секунды, представленные в виде чисел с плавающей запятой. При добавлении они накапливают ошибку, которая становится значительной по мере продвижения декодирования / воспроизведения. Например, суммирование в миллион раз 0.000001
дает нам 1.000000000007918
. Хорошо, CMTime
звучит как отличная идея.
let d: Double = 0.000001
var n: Double = 0
for _ in 0 ..< 1_000_000 { n += d }
print(n)
// 1.000000000007918
Однако при попытке преобразовать случайное Double
в CMTime
вышеприведенная ошибка выглядит как шутка по сравнению с разницей между оригинал Double
и его CMTime
значение. Вы можете догадаться, как будет выглядеть эта разница после добавления этих случайных CMTime
значений миллион раз!
import CoreMedia
print("Simple number after 1,000,000 additions and diff between random ")
print("number before/after converting to CMTime:")
print("add:", String(format: "%.20f", 1.000000000007918))
for _ in 0 ..< 10 {
let seconds = Double.random(in: 0 ... 10)
// Let's go with the max timescale!
let time = CMTime(seconds: seconds, preferredTimescale: .max)
print("dif:", String(format: "%.20f", seconds - time.seconds))
}
// Simple number after 1,000,000 additions and diff between random
// number before/after converting to CMTime:
// add: 1.00000000000791811061
// dif: 0.00000000025481305954
// dif: 0.00000000027779378797
// dif: 0.00000000000071231909
// dif: 0.00000000024774449159
// dif: 0.00000000028195579205
// dif: 0.00000000029723601358
// dif: 0.00000000029402880131
// dif: 0.00000000044737191729
// dif: 0.00000000036750824606
// dif: 0.00000000043562398133
С другой стороны, да, если любой данный Double
может быть точно преобразован в CMTime
, тогда это не будет проблемой.
Вопрос. Я пытаюсь выяснить, имеет ли смысл использовать CMTime
самостоятельно для передачи времени (очевидно, помимо миллиона дополнений) или это полезно только для работы с API, которые принимают и возвращают значения в формате CMTime
? Чтобы дать некоторый контекст, у меня есть приложение для редактирования видео с индивидуальным пользовательским интерфейсом (проигрыватель, треки, временные шкалы), которое имеет дело с регулировками скорости воспроизведения, обрезкой и реорганизацией треков и т. Д. c. Использование значений времени от Double
до express прекрасно работает, оно чисто, просто и делает свою работу. Но CMTime
кажется «правильным» способом сделать это. Однако, видя, что происходит с Double
после преобразования его туда и обратно, я удивляюсь, что область применения CMTime
столь же узка, как и средства кодирования и декодирования?