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