gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:24:05 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com