Вставьте кадры в видео с помощью FFMPEG - PullRequest
0 голосов
/ 03 апреля 2019

Камера, с которой я записываю видео, время от времени пропускает кадры, поэтому мне нужно повторно вставить кадры в видео, чтобы сохранить точное время.

У меня уже есть скрипт, чтобы точно определить, когда эти кадры были отброшены, поэтому у меня есть индекс каждого кадра, который нужно вставить и где.

Например, в 100-секундном видео со скоростью 100 кадров в секунду у меня должно быть 10000 кадров. Однако в кадрах 399, 1205, 4299 и 7891 было пропущено 4 кадра. Итак, я хочу либо вставить черную рамку с тем же разрешением в тех местах, либо сохранить предыдущий кадр ровно для одного кадра (например, удерживать кадр 398 для дополнительный кадр или 0,01 с).

Есть ли способ сделать это итеративно в FFMPEG? В настоящее время я записываю видео в составные кадры, добавляю пустые изображения, а затем повторно объединяю видео из кадров, что является очень неэффективным процессом.

1 Ответ

0 голосов
/ 06 апреля 2019

Давайте возьмем видео со значением частоты кадров 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 затем заполнит эти слоты клоном предыдущего доступного кадра.

...