ffmpeg usuwa części bez ruchu

13

Mam kamerę bezpieczeństwa IP (192.168.0.8), która może nadawać treści rtsp przez sieć.

Mogę zapisać tę zawartość (RAW) bez zmian za pomocą następnego polecenia ffmpeg z mojego komputera:

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

Mogę także zmienić jego rozmiar w locie:

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

Ale jak zapisać tylko ten film, który zawiera tylko detektory ruchu?

Próbowałem go rozwiązać za pomocą programu ffmpeg filtry zmiany sceny , ale nie ma szczęścia.

Mój cel - mieć wspólne rozwiązanie do monitorowania wideo, które wykrywa, kiedy ktoś zbliża się do kamery i zapisuje go w pliku wideo. Rozumiem, że nie jest możliwe zrobienie tego w locie ze strumienia, więc dobrze jest najpierw zapisać duży plik, a następnie przetworzyć go innym poleceniem ffmpeg i wygenerować nowy plik wideo zawierający tylko części wykryte przez ruch. Jeśli możesz mi doradzić, co dokładnie powinienem badać, będę wdzięczny.

Mój strumień kamery jest przesyłany bez dźwięku. Mogę więc wygenerować zestaw obrazów z oryginalnego wideo, a następnie wybrać odpowiednie obrazy, a następnie zapisać nowe wideo z obrazów.

rfedorov
źródło
Czy chcesz wdrożyć ten system lub znaleźć gotowy do użycia produkt?
Woeitg
@WOEITG Potrzebuję tylko darmowego rozwiązania dla Ubuntu 15.04+
rfedorov
W systemie Windows istnieje oprogramowanie zwane ispy, które można ustawić na nagrywanie przy wykrywaniu ruchu. Ponieważ prosisz o rozwiązanie Linux, zoneminder.com powinien być podobny produkt. Niestety nie mam bezpośredniej odpowiedzi na twoje pytanie, ale +1, ponieważ chciałbym też uzyskać odpowiedź
MyNameWouldGoHere

Odpowiedzi:

5

Co bym zrobił, to zrobić dokładnie tak, jak powiedziałeś i zapisać duży plik strumienia, a następnie użyć select Filtr FFMPEG z scene wyrażenie, które porównuje podobieństwo kolejnych klatek: select=gt(scene\,0.003) na przykład. Im wyższa liczba, tym więcej zmian między ramkami jest ignorowanych, w szybkim testowaniu może być konieczne obniżenie do 0,00001-0,00005 w zależności od rodzaju materiału, z którym masz do czynienia.

Połącz to z setpts filtr , który modyfikuje „czas rozpoczęcia” klatek wideo, a skończy się na czymś w rodzaju (dla wideo 25 klatek na sekundę):

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

Pamiętaj, że nie będziesz mógł korzystać -vcodec copy kiedy używasz filtrów wideo.

shinmai
źródło