Python скрипт для загрузки файлов из архива камер и регистраторов.

alexeg

Ровнорукий
Написал тут python скриптик для синхронизации видоархива камер dahua и облака mega.nz. Он позволяет скачать dav файлы за заданный период с камеры и тут же заливает их в облако.
Собственно прошу не придраться к самой теме, ибо по пути у меня еще предусмотрена обработка этих файлов при помощи компьютерного зрения, потому прямая заливка на ftp или nas не интересна. Да и вообще, все же захотелось свой метод выдергивания файлов из камер с SD картами/регистратора. Тот же RemotePlayBackTool подзадолбал своим ограничением в 100 файлов, когда пришлось вытягивать видео за неделю с достаточно проходной камеры. Да и , внезапно, не работает он с одиночными камерами. Хотя API тот же.
Для себя изучив API dahua, написал вот такой скриптик (во вложении). Он умеет подключаться к камере, вытягивать Dav файлы за интервал времени без ограничения по количеству, и заливать их на удаленный сервер.
При подключении к одиночной камере с SD картой все работает без проблем.
Login OK! Total: 53687091200.0 Used: 35095520.0 Free: 53651995680.0
Trying to login 192.168.0.110
Login success! Got token: 64538280
Trying to find files in interval: 2020-8-16 01:30:00 - 2020-8-16 01:40:00
Find files success! Got response: OK
Got file record: /mnt/sd/2020-08-16/001/dav/01/01.29.18-01.30.17[M][0@0][0].dav length: 26052907
Got file record: /mnt/sd/2020-08-16/001/dav/01/01.30.19-01.32.56[M][0@0][0].dav length: 72192180
Got file record: /mnt/sd/2020-08-16/001/dav/01/01.33.20-01.39.18[M][0@0][0].dav length: 143003371
File c:\temp\01.29.18-01.30.17[M][0@0][0].dav exists, skipping!
File: 192.168.0.120_4_20200614131500-20200614131908.dav Size: 35095520 Date: 2020-08-16 22:10:23 [0 days]
UPLOADING ...c:\temp\01.29.18-01.30.17[M][0@0][0].dav
100%|██████████| 26.1M/26.1M [01:34<00:00, 275kiB/s]
Downloading 2 of 3 to c:\temp\01.30.19-01.32.56[M][0@0][0].dav
100%|██████████| 72.2M/72.2M [00:09<00:00, 7.57MiB/s]
File: 192.168.0.120_4_20200614131500-20200614131908.dav Size: 35095520 Date: 2020-08-16 22:10:23 [0 days]
File: 01.29.18-01.30.17[M][0@0][0].dav Size: 26052907 Date: 2020-08-16 23:35:04 [0 days]
UPLOADING ...c:\temp\01.30.19-01.32.56[M][0@0][0].dav
100%|██████████| 72.2M/72.2M [05:09<00:00, 233kiB/s]
Downloading 3 of 3 to c:\temp\01.33.20-01.39.18[M][0@0][0].dav
100%|██████████| 143M/143M [00:18<00:00, 7.60MiB/s]
File: 192.168.0.120_4_20200614131500-20200614131908.dav Size: 35095520 Date: 2020-08-16 22:10:23 [0 days]
File: 01.29.18-01.30.17[M][0@0][0].dav Size: 26052907 Date: 2020-08-16 23:35:04 [0 days]
File: 01.30.19-01.32.56[M][0@0][0].dav Size: 72192180 Date: 2020-08-16 23:40:26 [0 days]
UPLOADING ...c:\temp\01.33.20-01.39.18[M][0@0][0].dav
14%|█ | 20.4M/143M [01:29<09:00, 227kiB/s]
Однако при попытке скачать файл с регистратора (DHI-NVR2108-4KS2 V4.000.0000001.5 ), постоянно получаю ошибку авторизации. Т.е. процесс подключения проходит штатно, список файлов отдается верно, но вот скачка dav файла обламывается с ошибкой авторизации.

Ссылка на скачку выглядит вот так:
http://192.168.0.120/cgi-bin/RPC_Loadfile/mnt/dvr/2020-06-22/003/dav/08/0/0/183965/08.31.03-08.31.54[M][0@0][0].dav
авторизация digest (хотя пробовал и basic)
Размер файла в заголовке запроса отдается, а вот скачка не идет.

HTML:
URL Syntax http://<ip>/cgi-bin/RPC_Loadfile/<filename>
For example:
http://10.61.5.117/cgi-bin/RPC_Loadfile/2012_09_15_12_37_05:2012_09_15_18_34_14[0][0].dav

При подключении к одиночной камере все работает, а к регистратору не хочет. Через браузер также не получается скачать файл по ссылке. Та же ошибка авторизации. Там в новой версии что-то поменяли с безопаской? Пробовал включать compatible mode безопасности - тот же эффект.

P.S. кстати , а может ли кто поделиться свежим dahua API ? Хотя бы 2.7
 

Вкладення

Останнє редагування:

Техпідтримка VidiMost.com

Спеціаліст
Команда форуму
поделиться свежим dahua API ? Хотя бы 2.7
это невозможно, его дают крупным дилерам под подписку о не разглашении, заверенную печатями и подписывая договор с собственником компании.

Поищите в сети, были утечки 2.76 и даже 2.78 но не полностью.
 

alexeg

Ровнорукий
Поищите в сети, были утечки 2.76 и даже 2.78 но не полностью.
да, 2.76 нашел, но в части скачки файлов там ничего не изменилось
Добавился лишь метод 4.11.14 Encrypted Download Media File with the File Name
Syntax http:///cgi-bin/RecordStreamInterleaved.cgi?action=attachStream&path=<FileName>&password=<Password>
но он тоже не работает :(
 

alexeg

Ровнорукий
Отличается тем, что путь к файлу иной. У камеры с SD картой, действительно путь начинается с /mnt/sd/ , а у DVR соответственно /mnt/dvr . Этот путь отдается по API методу FindFiles. Он у DVR отрабатывается верно, а вот при скачке файла затык. При чем на запрос файла отдается верной размер файла, а значит путь к файлу верный, просто отлуп идет по неверной авторизации.
Скорее всего у DVR какой-то иной способ авторизации при сачивании файла. При том, что все остальные api методы работают также как и с единичной камерой.

Смотрел сниффером , как работает Video PlayBack Download Tool , но они тянут по своему протоколу по порту 37777 , описания которому я не нашел, может кто поделится? Хотя до момента скачивания файлов там обмен идет такой же , как и по 80-у порту до момента непосредственно получения файла.
Вот есть , кстати, библиотечка для камер amcrest https://github.com/tchellomello/python-amcrest , у которых апи такое же как у дахуа, но там скачка делается также , как у меня с использованием той же digest авторизации.
 

alexeg

Ровнорукий
В общем у меня получилось только так можно добраться до архивного файла из dvr rtsp://admin:PassWord@192.168.0.120:554//mnt/dvr/2020-08-17/003/dav/16/0/3/145534/16.19.56-16.25.00[M][0@0][0].dav
внимание именно 2 черточки перед //mnt !

Или с использованием ffmpeg, без перекодировки:
ffmpeg -i "rtsp://admin:PassWord@192.168.0.120:554//mnt/dvr/2020-08-17/003/dav/16/0/3/145534/16.19.56-16.25.00[M][0@0][0].dav" -vcodec copy -acodec copy -f mp4 -y 16.19.56-16.25.00[M][0@0][0].dav

с перекодировкой в mpeg
ffmpeg -i "rtsp://admin:PassWord@192.168.0.120:554//mnt/dvr/2020-08-17/003/dav/16/0/3/145534/16.19.56-16.25.00[M][0@0][0].dav" -c:v libx264 -crf 24 16.19.56-16.25.00[M][0@0][0].mp4

Подожду, мож кто поможет по поводу api и RPC_Loadfile , тот способ быстрее.

P.S. теперь хочу попробовать в промежуточной фазе вытаскивать лица из потока, в принципе rtsp мне тут вполне подойдет.
Т.е. смысл такой: задаем интервал, скрипт вытаскивает все видео их архива DVR и прогоняет через распознавалку лиц, делая отбор кадров исключительно. Попробую через dlib , интересно было бы устроить челендж, если кто поделится результатом работы dahua регистраторов нового поколения с распознаванием лиц. Хотелось бы сравнить результаты.

Вообще тут кому-то интересна тема компьютерного зрения ? Распознавания людей, предметов, лиц , номеров ...
 
Останнє редагування:

alexeg

Ровнорукий
та тема то интересная, просто на это нужно время...
На самом деле ничего сложного , у меня тут больше времени заняли затыки с получением архивов из камеры. Просто обработка в реалтайме требует вычислительных ресурсов. А так забрал себе последнее сохраненное видео, запустил обработку.
Стек пока такой: Opencv детекция движения (отбираем реально изменившиеся кадры) -> detectron2 (выделение и сегментация объектов люди, машины) -> dlib (распознавание и детекция лиц) + детекция номеров.
Вот и интересно, насколько это качественно реализовано в новых dahua DVR-ах. Все это компьютерное зрение достаточно прожорливо даже на GPU, интересно как это работает на слабом железе.

P.S. кстати, все еще интересует как скачать видео из архива DVR-а напрямую через 80 порт или 37777, ибо по rtsp это намного медленнее. Может кто подскажет, готов даже оплатить, в разумных пределах.
 

alexeg

Ровнорукий
Было время сделал автоматическую закачку с регистраторов NVR Dahua
Позволяет скачать видео с регика за любой интервал времени, может кому пригодится.
Установка:
1). Качаем anaconda https://www.anaconda.com/products/individual или чистый pythoh https://www.python.org/downloads/, устанавливаем
2). Если установили anaconda , то создаем окружение
conda create --name dahua_sdk python=3.7
conda activate dahua_sdk
3). Устанавливаем пакет tqdm - pip install tqdm
4). Качаем скрипт + SDK (перевел с китайского на русский) в аттаче - dahua_nwr_downloader.zip

Папку libs взять из архива General_NetSDK_ChnEng_Python_Win64_IS_V3.052.0000001.0.R.200514.rar скачанного с
NetSDK (Win64) https://www.dahuasecur…-search?keyword=NetSDK
и положить в тот же каталог со скриптом dahua_nwr_downloader.py .
правда под питон только для винды, под линукс либы только на GoLang.
5). Запускаем: python dahua_nwr_downloader.py

В скрипте 2 функции
DownloadByTime - скачивает видео одним куском за заданный интервал.
Параметры:
1). d:\temp\out.dav - в какой файл сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

DownloadByFile - скачивает с сохранением структуры папок NVR-a
Параметры:
1). d:\temp\ - в какую папку сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

дата в формате DD-MM-YYYY HH : MM : SS

Если надо слить видео за несколько дней :
Код:
    dnd = DahuaNVRDownloader("192.168.0.20","admin","Mypassword",0) #0 - основной канал
    if dnd.Login():
        for day in range(15,27): #скачиваем с 15 по 27 число
            logging.info("Day: "+str(day))
            dnd.DownloadByFile(r"E:\TEMP_OCT", 2, str(day)+"-10-2020 08:00:00", str(day)+"-10-2020 17:20:00") #задаем временной интервал
Я за ночь скачал месячный архив. Ибо замучался по 100 файлов тягать ToolBox-овской качалкой

Вроде просто все))) Этот вариант работает только с NVR-ами.

В этом NetSDK есть много еще чего интересного. Возможность воспроизведения потока с камер, загрузка конфига, установка настроек, управление камерой и обработка событий: сработка движения/звука, цифровые входы и т.д. Можно много чего интересно заавтоматизировать. Примеры есть в SDK.
 

Вкладення

Останнє редагування:

Somikov

New member
Было время сделал автоматическую закачку с регистраторов NVR Dahua
Позволяет скачать видео с регика за любой интервал времени, может кому пригодится.
Установка:
1). Качаем anaconda https://www.anaconda.com/products/individual или чистый pythoh https://www.python.org/downloads/, устанавливаем
2). Если установили anaconda , то создаем окружение
conda create --name dahua_sdk python=3.7
conda activate dahua_sdk
3). Устанавливаем пакет tqdm - pip install tqdm
4). Качаем скрипт + SDK (перевел с китайского на русский) в аттаче - dahua_nwr_downloader.zip

Папку libs взять из архива General_NetSDK_ChnEng_Python_Win64_IS_V3.052.0000001.0.R.200514.rar скачанного с
NetSDK (Win64) https://www.dahuasecur…-search?keyword=NetSDK
и положить в тот же каталог со скриптом dahua_nwr_downloader.py .
правда под питон только для винды, под линукс либы только на GoLang.
5). Запускаем: python dahua_nwr_downloader.py

В скрипте 2 функции
DownloadByTime - скачивает видео одним куском за заданный интервал.
Параметры:
1). d:\temp\out.dav - в какой файл сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

DownloadByFile - скачивает с сохранением структуры папок NVR-a
Параметры:
1). d:\temp\ - в какую папку сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

дата в формате DD-MM-YYYY HH : MM : SS

Если надо слить видео за несколько дней :
Код:
    dnd = DahuaNVRDownloader("192.168.0.20","admin","Mypassword",0) #0 - основной канал
    if dnd.Login():
        for day in range(15,27): #скачиваем с 15 по 27 число
            logging.info("Day: "+str(day))
            dnd.DownloadByFile(r"E:\TEMP_OCT", 2, str(day)+"-10-2020 08:00:00", str(day)+"-10-2020 17:20:00") #задаем временной интервал
Я за ночь скачал месячный архив. Ибо замучался по 100 файлов тягать ToolBox-овской качалкой

Вроде просто все))) Этот вариант работает только с NVR-ами.

В этом NetSDK есть много еще чего интересного. Возможность воспроизведения потока с камер, загрузка конфига, установка настроек, управление камерой и обработка событий: сработка движения/звука, цифровые входы и т.д. Можно много чего интересно заавтоматизировать. Примеры есть в SDK.
Вообще конечно бомбическая штука получилась. Вчера увидел. До 3 ночи игрался.
Хотел выгрузить не видосы, а фотки. Пришлось немного допилить.
Спасибо!

Поделитесь, чем закончился Ваш проект? Что получилось реализовать?
 

galex

New member
Было время сделал автоматическую закачку с регистраторов NVR Dahua
Позволяет скачать видео с регика за любой интервал времени, может кому пригодится.
Установка:
1). Качаем anaconda https://www.anaconda.com/products/individual или чистый pythoh https://www.python.org/downloads/, устанавливаем
2). Если установили anaconda , то создаем окружение
conda create --name dahua_sdk python=3.7
conda activate dahua_sdk
3). Устанавливаем пакет tqdm - pip install tqdm
4). Качаем скрипт + SDK (перевел с китайского на русский) в аттаче - dahua_nwr_downloader.zip

Папку libs взять из архива General_NetSDK_ChnEng_Python_Win64_IS_V3.052.0000001.0.R.200514.rar скачанного с
NetSDK (Win64) https://www.dahuasecur…-search?keyword=NetSDK
и положить в тот же каталог со скриптом dahua_nwr_downloader.py .
правда под питон только для винды, под линукс либы только на GoLang.
5). Запускаем: python dahua_nwr_downloader.py

В скрипте 2 функции
DownloadByTime - скачивает видео одним куском за заданный интервал.
Параметры:
1). d:\temp\out.dav - в какой файл сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

DownloadByFile - скачивает с сохранением структуры папок NVR-a
Параметры:
1). d:\temp\ - в какую папку сохранить
2). 2 - номер канала
3). 15-10-2020 09:00:00 - дата начала
4). 15-10-2020 09:10:00 - дата окончания

дата в формате DD-MM-YYYY HH : MM : SS

Если надо слить видео за несколько дней :
Код:
    dnd = DahuaNVRDownloader("192.168.0.20","admin","Mypassword",0) #0 - основной канал
    if dnd.Login():
        for day in range(15,27): #скачиваем с 15 по 27 число
            logging.info("Day: "+str(day))
            dnd.DownloadByFile(r"E:\TEMP_OCT", 2, str(day)+"-10-2020 08:00:00", str(day)+"-10-2020 17:20:00") #задаем временной интервал
Я за ночь скачал месячный архив. Ибо замучался по 100 файлов тягать ToolBox-овской качалкой

Вроде просто все))) Этот вариант работает только с NVR-ами.

В этом NetSDK есть много еще чего интересного. Возможность воспроизведения потока с камер, загрузка конфига, установка настроек, управление камерой и обработка событий: сработка движения/звука, цифровые входы и т.д. Можно много чего интересно заавтоматизировать. Примеры есть в SDK.
Третий день бьюсь, помогите, если кто знает как - нужно выгрузить 10 камер за 3 дня, скрипт выше выдает ошибку:
AttributeError: type object 'NetClient' has no attribute 'sdk'

Код:
C:\Users\Galex>D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py

Traceback (most recent call last):

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py", line 185, in <module>

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py", line 54, in init

    self.sdk.InitEx(m_DisConnectCallBack)

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\NetSDK\NetSDK.py", line 233, in InitEx

    result = cls.sdk.CLIENT_InitEx(call_back, user_data, init_param)

             ^^^^^^^

AttributeError: type object 'NetClient' has no attribute 'sdk'
 

Kirill_434

New member
Третий день бьюсь, помогите, если кто знает как - нужно выгрузить 10 камер за 3 дня, скрипт выше выдает ошибку:
AttributeError: type object 'NetClient' has no attribute 'sdk'

Код:
C:\Users\Galex>D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py

Traceback (most recent call last):

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py", line 185, in <module>

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\dahua_nwr_downloader.py", line 54, in init

    self.sdk.InitEx(m_DisConnectCallBack)

  File "D:\Dahua\Downloade_script_SDK\General_NetSDK_Eng_Win64_IS_V3.056.0000000.0.R.221028\NetSDK\NetSDK.py", line 233, in InitEx

    result = cls.sdk.CLIENT_InitEx(call_back, user_data, init_param)

             ^^^^^^^

AttributeError: type object 'NetClient' has no attribute 'sdk'
Вы не скачали sdk библиотеки.
Можете их с интернета скачать, так и пишите dhnetsdk.dll и dhconfigsdk.dll
Закиньте их в папку там же где NetDSK (корень репозитория)
И измените класс NetClient в файле NetSDK.py

Python:
@classmethod
    def _load_library(cls):
        try:
            cls.sdk = windll.LoadLibrary(netsdkdllpath)
            cls.config_sdk = windll.LoadLibrary(configdllpath)
        except OSError as ex:
            print(f'Failed to load dynamic libraries: \n{ex}')
Это нужно для того чтобы ошибку вам показывало и вы не гадали что у вас не так.
А в идеале тут можно сделать логгер чтобы весь стэк ошибок записался туда и вы могли легко идентифицировать события.


Python:
import logging
logger = logging.getLogger(__name__)
Можете ознакомиться в ютуб и других источниках о логгере если вам это нужно будет.
В итоге эта часть тогда преобразуется так:
Python:
@classmethod
    def _load_library(cls):
        try:
            cls.sdk = windll.LoadLibrary(netsdkdllpath)
            cls.config_sdk = windll.LoadLibrary(configdllpath)
        except OSError as ex:
            print(f'Failed to load dynamic libraries: \n{ex}')
            logger.exception('load net dsk library error')
 
Зверху