Niedawno zetknąłem się z sytuacją, gdzie należało zweryfikować (i zachować!) statyczne obrazy z kamer (ramki / zdjęcia) z danego momentu czasu. Nie chcąc wykonywać mozolnych pojedynczych zrzutów per kamera postanowiłem zaprzęgnąć do tego celu prosty skrypt. Jego opis oraz efekt działania przedstawiam w poniższym wpisie.
Recently I was asked to verify (and save!) static camera frames / photos from exact moment in time (time stamp). To avoid manual work I decided to prepare simple script. Short description and how does it work you can find in below article.
English version below.
Gdzie w takim razie może się to przydać i co tak naprawdę rozważamy? Są sytuację, gdzie chcemy okresowo archiwizować stan kamer – ustawienie, dostępność, bieżący widok, lub też po prostu chcielibyśmy mieć proste narzędzie, którym możemy “zrzucić” widoki ze wszystkich lokalnych kamer z pominięciem oprogramowania producenta. Zachowanie obrazu w formacie JPG jest najlepszym rozwiązaniem w tym przypadku, jednakże wiąże się z tym, że najczęściej czeka nas mozolne zapisywanie jednej kamery po drugiej. W tym momencie na pomoc przychodzi nam automatyzacja: skrypt jest w stanie wykonać za nas większość pracy, a przy okazji przygotować pliki z określonym nazewnictwem. Jak to działa w praktyce?
Przygotowania
W celu masowego pobrania zrzutów z kamer wykorzystamy protokół HTTP (każdy producent ma swoją ścieżkę do pobierania zdjęć z kamer – w naszym przypadku skupimy się na Hikvision, ale równie dobrze można użyć ścieżki dowolnego producenta) wraz z narzędziem WGET. Narzędzie to nie jest dostępne domyślnie w systemie Windows, dlatego należy je pobrać stąd (plik ZIP, który następnie rozpakowujemy) i umieścić plik wget.exe w lokalizacji: C:\Windows\System32
Operacja ta pozwoli nam uruchamiać WGET z dowolnej ścieżki co z pewnością ułatwi używanie poniższego skryptu.
Skrypt
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" set "datestamp=%YYYY%%MM%%DD%" set "timestamp=%HH%%Min%" rem Create folder: mkdir %datestamp%%timestamp% rem Hikvision Cameras Path: wget.exe http://admin:password@192.168.14.197:80/ISAPI/Streaming/channels/101/picture -T 3 -t 1 -O %datestamp%%timestamp%\101.jpg wget.exe http://admin:password@192.168.14.198:80/ISAPI/Streaming/channels/101/picture -T 3 -t 1 -O %datestamp%%timestamp%\102.jpg |
Pierwsza część skryptu odpowiada za stworzenie folderu z datą oraz godziną w nazwie w lokalizacji w której uruchamiamy program w formacie: “202210252034” co oznacza: 2022/10/25, 20:34.
Druga część to już konkretny proces pobierania – ścieżki należy oczywiście przygotować według własnych potrzeb i jest to jedyny moment, kiedy należy wykonać część pracy w sposób manualny (jak to zresztą często bywa przy skryptach 🙂
Słowem wyjaśnienia: dodałem dwa parametry, które w przypadku próby pobrania zdjęcia z kamery, która nie jest aktywna (lub jest niedostępna) będą próbowały się do niej “dostać” przez 3 sekundy po czym nie będzie ponownej próby: “-T 3 -t 1 -O”.
Dodatkowo na końcu można zdefiniować nazwę pliku jaki ma się utworzyć z danej kamery – w moim przypadku to np. 101.jpg.
Warto zauważyć, że liczba odpytywanych kamer jest w praktyce nieograniczona – lokalizacje mające nawet kilkaset kamer jesteśmy w stanie zebrać w kilka minut.
Rezultatem działania naszego skryptu jest poniższy folder zawierający pliki JPG ze skonfigurowanych kamer:
English version
Ok, so where we can use this and what exactly we are considering here? There are situations where we want to periodically archive the state of cameras – setting, availability, current view, or we just want to have a simple tool with which we can “dump” views from all local cameras without the manufacturer’s software. Saving the image in JPG format is the best solution in this case, however, it is associated with the fact that most often we have to slowly save one camera after another. At this point, automation comes to fix this problem: the script is able to do most of the work for us, and at the same time prepare files with specific names. How does it work in practice?
Preparations
In order to mass download screenshots from cameras, we will use the HTTP protocol (each producer has its own path for downloading photos from cameras – in our case we will focus on Hikvision, but you can also use the path of any manufacturer) along with the WGET tool. This tool is not available by default in Windows, so download it from here (a ZIP file, then unpack it) and place the wget.exe file in the location: C:\Windows\System32
This operation will allow us to run WGET from any path, which will certainly help the use of the script below.
Script
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" set "datestamp=%YYYY%%MM%%DD%" set "timestamp=%HH%%Min%" rem Create folder: mkdir %datestamp%%timestamp% rem Hikvision Cameras Path: wget.exe http://admin:password@192.168.14.197:80/ISAPI/Streaming/channels/101/picture -T 3 -t 1 -O %datestamp%%timestamp%\101.jpg wget.exe http://admin:password@192.168.14.198:80/ISAPI/Streaming/channels/101/picture -T 3 -t 1 -O %datestamp%%timestamp%\102.jpg |
The first part of the script is responsible for creating a folder with the date and time in the name in the location where we run the script in the format: “202210252034” which means: 2022/10/25, 20:34.
The second part is a specific download process – paths should of course be prepared according to your needs and this is the only moment when you need to do some of the manual work (as usual when you work with the scripts 🙂
Note: I add two parameters which if you try to download a photo from a camera that is not active (or unavailable), it will try to “get” to it for 3 seconds and then there will be no retry: “-T 3 -t 1 -O”.
Additionally, at the end of the line you can define the name of the file to be created from the given camera – in my case it is e.g. 101.jpg.
It is worth noticed that the number of operational cameras is practically unlimited – we are able to collect even several hundred cameras in a few minutes. The result of our script is the following folder containing JPG files from configured cameras: