Обнаружение изменения сцены на части кадра

#ffmpeg #crop #scene

Вопрос:

У меня есть видеофайл онлайн-лекции, состоящий из слайд-шоу со звуком в фоновом режиме.
Я хочу сохранить изображения каждого слайда, а также временную метку этого слайда. Я делаю это, используя фильтры сцены и метаданных:

 ffmpeg -i week-01.mp4 -filter_complex "select='gt(scene,0.011)',metadata=print:file=frames/time.txt" -vsync vfr frames/imgd.jpg
 

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

Итак, вот мой вопрос, могу ли я попросить ffmpeg:

  1. проанализируйте часть кадра (только правую сторону примерно до 75% влево).
  2. Затем, обнаружив изменение сцены в этой области, сохраните весь кадр и метку времени.

Я подумал о том, чтобы сделать сценарий, который

  1. обрезает видео и сохраняет его рядом с исходным
  2. проанализируйте обрезанное видео для изменения сцены и сохраните метки времени
  3. извлеките кадры из исходного видео, используя временные метки

Есть ли лучший/более быстрый/короткий способ сделать это? Заранее спасибо!

Ответ №1:

Вы можете сделать это одной командой, как это,

ffmpeg -i week-01.mp4 -filter_complex "[0]split=2[full][no_timer];[no_timer]drawbox=w=0.25*iw:h=ih:x=0.75*iw:y=0[no_timer];[no_timer]select='gt(scene,0.011)',metadata=print:file=frames/time.txt[no_timer];[no_timer][full]overlay" -vsync vfr frames/imgd.jpg

В принципе, сделайте две копии видео, используйте drawbox на одной копии, чтобы закрасить сплошным черным цветом четверть экрана справа, проанализируйте изменение сцены и запишите результаты в файл; затем наложите полный неокрашенный кадр поверх окрашенных. Из-за того, как наложение синхронизирует кадры, для наложения поверх базовых выбранных кадров будут использоваться только полные кадры с соответствующими метками времени.

Комментарии:

1. Я чувствую, что это может быть правильным ответом или, по крайней мере, на правильном пути. Проблема в том, что выполнение этой команды неуклонно увеличивает использование оперативной памяти до тех пор, пока процесс автоматически не завершится при достижении максимального значения 4 ГБ. Использование оперативной памяти увеличивается только в промежутках между сценами. Если я понижу пороговое значение сцены, команда выполняется без проблем, хотя тогда, конечно, она обнаруживает слишком много сцен.

2. Это звучит как ограничение ресурсов, а не как команда. Убедитесь, что вы используете последнюю версию ffmpeg 4.3 или новее.