Как я могу кодировать видео в реальном времени из динамически разнесенных кадров? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать видео из серии скриншотов.Скриншоты находятся в базе данных и имеют динамический FPS (1-3 FPS).Как я могу создать видеофайл с постоянным FPS?

Перед выполнением av_packet_rescale_ts я попытался на лету изменить значение st^.codec.time_base.den между 1 и 3.

Это основной циклкодирования одного изображения:

repeat
  fillchar(pkt, sizeof(TAVPacket), #0);
  av_init_packet(@pkt);

  (* encode the image *)
  ret := avcodec_encode_video2(st^.codec, @pkt, frame, got_packet);
  if (ret < 0) then
  begin
    writeln(format('Error encoding video frame: %s', [av_err2str(ret)]));
    exit;
  end;

  if (got_packet > 0) then
  begin
    (* rescale output packet timestamp values from codec to stream timebase *)
    av_packet_rescale_ts(@pkt, st^.codec.time_base, st^.time_base);
    pkt.stream_index := st^.index;

    log_packet(oc, @pkt);
    (* Write the compressed frame to the media file. *)
    av_interleaved_write_frame(oc, @pkt);
  end;
  inc(frame.pts);

until (av_compare_ts(frame.pts, st^.codec^.time_base, 1, av_make_q(1, 1)) >= 0);

Изменение FPS на лету приводит к сбою вывода видео.Если я не изменю значение st^.codec.time_base.den, видео ускоряется и замедляется.

1 Ответ

0 голосов
/ 06 мая 2019

В ffmpeg отсутствует понятие динамической временной шкалы, поэтому изменение его во время кодирования запрещено.Но вы можете установить PTS своих кадров перед тем, как кодировать что-либо монотонно увеличивающееся.

Вы не показываете, как вы устанавливаете PTS в своем примере кода.Если вам нужна постоянная частота кадров, просто игнорируйте временные метки из вашей базы данных, подсчитайте кадры и вычислите PTS в соответствии с номером кадра (возможно, именно это делает ffmpeg, когда вы не назначаете ему PTS).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...