Я нашел способ точно зафиксировать задержку по времени, сравнивая последнее время в миллисекундах с текущим временем в миллисекундах.
Во-первых, у меня есть общая текущая функция времени в миллисекундах:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
Когда я создаю писателя (когда я начинаю записывать видео), я устанавливаю переменную в своем классе на текущее времяв миллисекундах:
currentCaptureMillisecondsTime = currentTimeInMilliSeconds()
Тогда в моей функции, которая должна вызываться 1/24 секунды, не всегда точно, поэтому мне нужно получить разницу в миллисекундах между тем, когда я начал писать, или моим последнимвызов функции.
Выполните преобразование миллисекунд в секунды и установите для него значение CMTimeMakeWithSeconds.
let lastTimeMilliseconds = self.currentCaptureMillisecondsTime
let nowTimeMilliseconds = currentTimeInMilliSeconds()
let millisecondsDifference = nowTimeMilliseconds - lastTimeMilliseconds
// set new current time
self.currentCaptureMillisecondsTime = nowTimeMilliseconds
let millisecondsToSeconds:Float64 = Double(millisecondsDifference) * 0.001
let sampleTimeOffset = CMTimeMakeWithSeconds(millisecondsToSeconds, preferredTimescale: 1000000000)
Теперь я могу добавить свой кадр с точной задержкой, которая фактически произошла.
self.currentSampleTime = CMTimeAdd(currentSampleTime, sampleTimeOffset)
let success = self.assetWriterPixelBufferInput?.append(cv, withPresentationTime: currentSampleTime)
Когда я заканчиваю записывать видео и сохраняю его в своей фотопленке, это точная продолжительность, с которой я записывал.