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.
źródło
Odpowiedzi:
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 zscene
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ę):Pamiętaj, że nie będziesz mógł korzystać
-vcodec copy
kiedy używasz filtrów wideo.źródło