Имеет ли CMTime какое-либо реальное применение вне носителей кодирования и декодирования? - PullRequest
2 голосов
/ 27 апреля 2020

Я понимаю понятие 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 столь же узка, как и средства кодирования и декодирования?

1 Ответ

2 голосов
/ 01 мая 2020

Ваша интуиция верна. Использование отвертки в качестве молотка может работать большую часть времени, но это не лучшее применение. Что еще более важно, в нем могут отсутствовать некоторые неочевидные крайние случаи, когда он просто не будет работать или вызовет дополнительную работу, чтобы забить гвоздь (например, двойная обработка).

Во-вторых, каков ваш метод конвертации? Возможно, вам не хватает крайнего случая, такого как изменение масштаба времени. Я не могу дать дальнейшие указания без дополнительной информации.

CMTime уже с точностью до кадра с AVPlayer без преобразования. Это то, для чего это было сделано, хотя убедитесь, что вы установили допуски и значения 0 в качестве допусков.

Примечание: я работаю с видео / аудио обработкой с точностью до кадра.

...