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

6684
rfedorov

У меня есть 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 и сгенерировать новый видеофайл, который содержит только детали, обнаруженные движением. Если вы можете дать мне совет, что именно я должен исследовать больше, я буду очень благодарен.

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

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

1 ответ на вопрос

5
shinmai

What I'd do, is do exactly like you said, and save a big file of the stream, then use the select FFMPEG filter with the scene expression, that compares the similarity of consecutive frames: select=gt(scene\,0.003) for instance. The higher the number, the more change between frames is ignored, in quick testing you might need to go as low as 0.00001-0.00005 depending on the kind of footage you're dealing with.

Combine that with the setpts filter, that modifies the "start time" of video frames, and you'd end up with something like (for a 25fps video):

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

Mind you, you won't be able to use -vcodec copy when you use video filters.

Похожие вопросы