#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:
- проанализируйте часть кадра (только правую сторону примерно до 75% влево).
- Затем, обнаружив изменение сцены в этой области, сохраните весь кадр и метку времени.
Я подумал о том, чтобы сделать сценарий, который
- обрезает видео и сохраняет его рядом с исходным
- проанализируйте обрезанное видео для изменения сцены и сохраните метки времени
- извлеките кадры из исходного видео, используя временные метки
Есть ли лучший/более быстрый/короткий способ сделать это? Заранее спасибо!
Ответ №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 или новее.