使用 FFMPEG 将帧插入视频

Insert frames into video using FFMPEG

我正在录制视频的相机偶尔会掉帧,因此我需要将帧重新插入视频以保持时间精确。

我已经有了一个脚本来准确识别这些帧何时被丢弃,所以我有一个需要插入的每个帧的索引以及插入位置。

例如,在 100 FPS 的 100 秒视频中,我应该有 10,000 帧。但是,在第 399、1205、4299 和 7891 帧处丢失了 4 帧。因此,我想在这些点插入一个相同分辨率的黑色帧,或者将前一帧保留一帧(例如,将第 398 帧保留为一个额外的帧,或 0.01 秒)。

有没有办法在 FFMPEG 中迭代执行此操作?我目前正在将视频写入其组成帧,添加我的空白图像,然后从帧中重新连接视频,这是一个非常低效的过程。

让我们拍摄一个帧速率值为 FR 的视频,您丢失的帧的索引为 399、1205、4299 和 7891。第一帧的索引为 0。

ffmpeg -i in.avi -vf setpts='PTS+(1/FR/TB)*(gte(N,399)+gte(N,1205)+gte(N,4299)+gte(N,7891))' -vsync cfr -q:v 1 out.avi

setpts 过滤器可以调整时间戳,setpts 表达式所做的是在给定索引向前偏移之后偏移所有帧。根据丢失的较早帧的数量来评估偏移量。这将创建空的时间戳槽。 -vsync cfr 选项将用先前可用帧的克隆填充这些槽。