ffmpeg удаляет детали без движения

15

У меня есть IP-камера безопасности (192.168.0.8), которая может транслировать контент RTSP по сети.

Я могу сохранить этот (RAW) контент без изменений, используя следующую команду ffmpeg с моего компьютера:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -acodec copy -vcodec copy test-raw.mp4

Я также могу изменить его размер на лету:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -vf  "scale=640:-1" test640.mp4

Но как сохранить только то видео, которое содержит только детали обнаружения движения?

Я пытался решить эту проблему с помощью фильтров смены сцены в ffmpeg , но безуспешно.

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

Поток моей камеры передается без звука. Таким образом, я могу создать набор изображений из исходного видео, затем выбрать правильные изображения и затем сохранить новое видео из изображений.

rfedorov
источник
Вы хотите внедрить эту систему или найти готовый продукт?
Woeitg
@WOEITG Мне просто нужно любое бесплатное рабочее решение для Ubuntu 15.04+
rfedorov
Для Windows есть программный продукт под названием ispy, который можно настроить для записи при обнаружении движения. Поскольку вы запрашиваете решение для Linux, zoneminder.com должен быть похожим продуктом. К сожалению, у меня нет прямого ответа на ваш вопрос, но +1, потому что я тоже хотел бы получить ответ
MyNameWouldGoHere

Ответы:

7

Я бы сделал, как вы сказали, и сохраните большой файл потока, затем используйте select фильтр FFMPEG с sceneвыражением, которое сравнивает сходство последовательных кадров: select=gt(scene\,0.003)например. Чем выше число, тем больше изменений между кадрами игнорируется, при быстром тестировании вам может понадобиться всего 0,00001-0,00005 в зависимости от типа отснятого материала.

Объедините это с setpts фильтром , который изменяет «время начала» видеокадров, и вы получите что-то вроде (для видео со скоростью 25 кадров в секунду):

ffmpeg -i input.mp4 -vf "select=gt(scene\,0.003),setpts=N/(25*TB)" output.mp4

Имейте в виду, вы не сможете использовать, -vcodec copyкогда вы используете видео фильтры.

shinmai
источник