video - 使用 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
选项将使用先前可用帧的克隆填充这些插槽。
推荐阅读
- oracle - Oracle DBMS_LOB.WRITEAPPEND 到 Postgres 的转换
- c# - 支持 IComparable 时的比较语法
- angular - Angular Material 主题问题
- jenkins - 在声明性管道的并行阶段重用代理
- sql - 如何通过将数字替换为 NULL 值并自动递增以下数字来更新 SQL Server 表?
- java - 从firebase数据库设置图像的墙纸按钮
- facebook - 我的应用程序如何读取一组测试用户的组提要/帖子?
- sp - 创建一个不规则形状的凸包
- apache - 尝试按照教程在 Debian Apache AWS Lightsail 实例上设置 SSL/TLS 证书,但仍然无法正常工作
- java - 如何将 RocksDB 数据移动到新目录?