使用 FFMPEG 将帧插入视频

Rya*_*anz 5 video command-line ffmpeg frame

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

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

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

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

Gya*_*yan 5

让我们看一个帧速率值为 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
Run Code Online (Sandbox Code Playgroud)

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