Попытка добавить CVPixelBuffers к AVAssetWriterInputPixelBufferAdaptor на предполагаемой частоте кадров - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь добавить CVPixelBuffers к AVAssetWriterInputPixelBufferAdaptor на предполагаемой частоте кадров, но, похоже, она слишком быстрая, и моя математика отключена. Это не захват с камеры, а захват меняющихся изображений. Реальное видео намного быстрее, чем истекшее время, когда оно было снято.

У меня есть функция, которая добавляет CVPixelBuffer каждые 1/24 секунды. Поэтому я пытаюсь добавить смещение 1/24 секунды к последнему разу.

Я пробовал:

let sampleTimeOffset = CMTimeMake(value: 100, timescale: 2400)

и:

let sampleTimeOffset = CMTimeMake(value: 24, timescale: 600)

и:

let sampleTimeOffset = CMTimeMakeWithSeconds(0.0416666666, preferredTimescale: 1000000000)

Я добавляю к currentSampleTime и добавляю так:

self.currentSampleTime = CMTimeAdd(currentSampleTime, sampleTimeOffset)

let success = self.assetWriterPixelBufferInput?.append(cv, withPresentationTime: currentSampleTime)

Еще одно решение, о котором я подумал, - это получить разницу между последним временем итекущее время, и добавьте это в currentSampleTime для точности, но не знаете, как это сделать.

1 Ответ

0 голосов
/ 08 ноября 2019

Я нашел способ точно зафиксировать задержку по времени, сравнивая последнее время в миллисекундах с текущим временем в миллисекундах.

Во-первых, у меня есть общая текущая функция времени в миллисекундах:

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)

Когда я заканчиваю записывать видео и сохраняю его в своей фотопленке, это точная продолжительность, с которой я записывал.

...