如何从动态间隔的帧中编码实时视频?

时间:2019-05-04 07:19:04

标签: delphi ffmpeg

我正在尝试根据一系列屏幕截图创建视频。屏幕截图位于数据库中,并具有动态FPS(1-3 FPS)。如何创建具有恒定FPS的视频文件?

在执行av_packet_rescale_ts之前,我试图在1到3之间快速更改st^.codec.time_base.den的值。

这是对一张图片进行编码的基本周期:

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 :(得分:0)

在ffmpeg中没有动态时基的概念,因此禁止在编码期间进行更改。但是,您可以在编码之前自由设置帧的PTS,使其单调递增。

您没有在示例代码中显示如何设置PTS。如果您想要恒定的帧速率,则只需忽略数据库中的时间戳,对帧进行计数并根据帧号计算一个PTS(很可能是ffmpeg在不提供任何PTS时所做的事情)。

如果您以不同的帧率记录帧,但没有为其记录任何时间戳,那么您将无法再获得流畅的视频。