Помогите мне понять CMTime в AVAssetWriter - PullRequest
2 голосов
/ 22 марта 2011

Мне трудно понять, как преобразовать поток JPEG в формате JPEG со скоростью 30 кадров в секунду с помощью AVAssetWriter в видеофайл.Часть, которую я не получаю, это метод [adapter appendPixelBuffer: buffer withPresentationTimeresentTime].

Как рассчитать значение withPresentationTime, если я хочу вывести видео 30peps mpeg4?

Источник видеокамера, которая в режиме реального времени обеспечивает потоковую передачу JPEG-видео со скоростью 30 кадров в секунду.

Оцените любую идею.

Спасибо

1 Ответ

7 голосов
/ 26 марта 2011

Вам нужно будет сгенерировать структуру 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 секунда.

...