Вам нужно будет сгенерировать структуру CMTime, используя CMTimeMake. Вам нужно будет увеличить время на 1/30 секунды для каждого кадра.
Вот эскиз:
CMTime time = CMTimeMake(0, 30); // (time, time_scale)
for(each image) {
[adaptor appendPixelBuffer:buffer withPresentationTime:time]
time.value += 1;
}
При настройке времени, как показано, наименьшее разрешение по времени составляет 1/30 секунды. time / time_scale = 1 секунда Я не уверен, есть ли конкретное требование для H.264. AVFoundation использует шкалу времени 1000000000 (1 000 000 000 или 1 миллиард) при захвате (по моему опыту).
Обновление:
Просто для обзора. Из структуры CMTime:
CMTimeValue value; /*! @field value The value of the CMTime. value/timescale = seconds. */
CMTimeScale timescale; /*! @field timescale The timescale of the CMTime. value/timescale = seconds. */
Временная база будет оставаться неизменной на протяжении всего видео. Допустим, у вас есть текущее значение 10 с шкалой времени 30. Текущее время в секундах составляет 10/30 = 0,33333 секунды. Значение времени для 40-го кадра вашего фильма равно 40/30 = 1,33333. Таким образом, 40-й кадр должен рендериться в 1,3333 секунды в фильме.
Я не уверен, подходит ли эта временная база для видео H.264. Я не знаком со спецификацией. Я знаю, что при захвате видео время презентации для видеокадров составляет 1000000000. Технически это не должно иметь значения. Время является рациональным числом - 1000000000/1000000000 = 1 секунда и 30/30 = 1 секунда.