我正在尝试根据一系列屏幕截图创建视频。屏幕截图位于数据库中,并具有动态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
的值,则视频会加速和减速。
答案 0 :(得分:0)
在ffmpeg中没有动态时基的概念,因此禁止在编码期间进行更改。但是,您可以在编码之前自由设置帧的PTS,使其单调递增。
您没有在示例代码中显示如何设置PTS。如果您想要恒定的帧速率,则只需忽略数据库中的时间戳,对帧进行计数并根据帧号计算一个PTS(很可能是ffmpeg在不提供任何PTS时所做的事情)。
如果您以不同的帧率记录帧,但没有为其记录任何时间戳,那么您将无法再获得流畅的视频。