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

标签 delphi ffmpeg

我正在尝试从一系列屏幕截图中创建视频。屏幕截图在数据库中,具有动态 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重视视频加速和减速。

最佳答案

ffmpeg 中没有动态时基的概念,因此禁止在编码期间更改它。但是您可以在编码之前自由地将帧的 PTS 设置为任何单调递增的值。

您没有在示例代码中展示如何设置 PTS。如果你想要一个恒定的帧率,只需忽略数据库中的时间戳,计算帧数并根据帧号计算 PTS(当你不给它任何 PTS 时,这可能是 ffmpeg 正在做的事情)。

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

关于delphi - 如何从动态间隔的帧中编码实时视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980414/

相关文章:

Delphi BPL 搜索路径

ffmpeg - 是否可以使用 ffmpeg 添加文本/图像水印?

firebase - 您可以在 Firebase 云功能中调用 FFMPEG

ffmpeg - 如何在没有很长启动时间的情况下通过 HTTP 流式传输很长的 H.264 视频? (或 : MOOV atom too large)

delphi - 如何在TChart标签中显示Unicode

delphi - 如何在 Delphi 2010 中使用 WS-* 标准

php - webm转换的编解码器参数不正确

colors - 将绿色的 nullsrc 变为黑色

delphi - 如何使用delphi发送测试页到打印机打印?

Delphi:WebBrowser 的 OnDownloadComplete 一次发生多次