首页 > 解决方案 > 使用 FFMPEG 将帧插入视频

问题描述

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

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

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

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

标签: videocommand-lineffmpegframe

解决方案


让我们以帧速率值为 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选项将使用先前可用帧的克隆填充这些插槽。


推荐阅读