Hikvision SDK для DELPHI
|
|
MaxGomonov | Дата: Среда, 27.02.2013, 15:54 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Как обещал в этой ветке выкладываю то, что у меня пока получилось в плане адаптации SDK для delphi.
А получилось пока следующее: - Авторизоваться - Вывести изображение с камеры на форму - Получить текущий фрейм (в jpeg) в буфер - обрабатывать сообщения (движение и т.п.) - сохранять скриншоты на диск.
Планирую (необходимо): - запись видео на диск по движению (если это реально) - вычисление скорости движения - более детальная обработка событий - настройка устройства
Собственно ссылки: - Модуль (.pas) - Демка=) добавил во вложении.
Сообщение отредактировал MaxGomonov - Среда, 27.02.2013, 16:45 |
|
|
|
Alexandr | Дата: Среда, 27.02.2013, 16:07 | Сообщение # 2 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| а где в демке логин\пасс ?
|
|
|
|
MaxGomonov | Дата: Среда, 27.02.2013, 16:15 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| если честно, не продумал этот момент=( логин/пасс в исходниках (admin 12345)
|
|
|
|
Alexandr | Дата: Среда, 27.02.2013, 16:17 | Сообщение # 4 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| надо додумать ) хоть бы в cfg закинуть.
|
|
|
|
MaxGomonov | Дата: Среда, 27.02.2013, 16:48 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Обновил ссылку, теперь можно вручную вводить, пока так
|
|
|
|
Priest | Дата: Вторник, 05.03.2013, 14:31 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 2
Репутация: 0
Статус: Offline
| Вот такая строка выдает картинку в браузере http://192.168.168.204/dispatch.asp?user=admin&pass=12345&page=preview.asp[&] А ваш код у меня не работает. Запускаю в Delphi 7, ошибок не выдает, но и не рисует ничего. В чем может быть проблема?
|
|
|
|
Alexandr | Дата: Вторник, 05.03.2013, 14:59 | Сообщение # 7 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| Priest, для этого нужно по ссылке в начале пройти, речь идёт о DS-6101HFI-IP. у камеры несколько другой способ получения картинки.
|
|
|
|
Priest | Дата: Вторник, 05.03.2013, 15:09 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 2
Репутация: 0
Статус: Offline
| Версия библиотек не та была. Старую скопировал и все заработало
|
|
|
|
MaxGomonov | Дата: Четверг, 07.03.2013, 20:10 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Доработал немного модуль HikVisionSDK.pas Добавил: - функцию записи видео в файл (NET_DVR_SaveRealData) - функцию остановки записи видео (NET_DVR_StopSaveRealData) - функцию установки callback на приход фрейма (PlayM4_SetDisplayCallBack)
Начал разбираться с модулем PlayM4.pas Добавил: - захват изображения в jpeg (PlayM4_GetJPEG) - Установка типа таймера (PlayM4_SetTimerType) - захват изображения в bmp (PlayM4_GetBMP) - освобождение порта (PlayM4_FreePort) - инициализация порта (PlayM4_GetPort)
Демку подготовить нет времени, но по названию функций можете все найти в мануале для HikVisionSDK.pas и для PlayM4.pas
Собственной сами модули: - HikVisionSDK.pas - PlayM4.pas
|
|
|
|
vxg | Дата: Пятница, 22.03.2013, 09:04 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| подскажите пожалуйста удалось ли вам разобраться с модулем playm4 (в частности - с функцией PlayM4_GetJPEG). интересует не прототип функции, а технология ее использования: есть желание делать снимки не выводя картинку на экран. нужно ли при этом открывать поток? обязательно ли при этом проигрывать поток?
|
|
|
|
MaxGomonov | Дата: Пятница, 22.03.2013, 10:46 | Сообщение # 11 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Перед выполнением функции PlayM4_GetJPEG() обязательно необходимо и открытие потока, и его воспроизведение. С другой стороны в файле HikVisionSDK.pas есть функция NET_DVR_CaptureJPEGPicture() которая сохраняет картинку без открытия и воспроизведения потока (необходимо просто подключится к устройству)
|
|
|
|
vxg | Дата: Пятница, 22.03.2013, 12:43 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| я не уверен в методе который использует функция NET_DVR_CaptureJPEGPicture для получения картинки. это непосредственный запрос картинки с устройства или тот же самый вызов PlayM4_GetJPEG(NET_DVR_GetPlayBackPlayerIndex(), ...) ?
|
|
|
|
MaxGomonov | Дата: Пятница, 22.03.2013, 15:21 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| В описании к функции NET_DVR_CaptureJPEGPicture сказано "This API is used to capture a frame and save to JPEG file" т.е. это сохранение текущего полученного фрейма в файл. Так же есть функция NET_DVR_CaptureJPEGPicture_NEW - получение картинки в буфер
|
|
|
|
vxg | Дата: Понедельник, 25.03.2013, 09:52 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| если для корректного выполнения функции PlayM4_GetJPEG необходимо воспроизведение потока (странно, что открытия потока и запихивания в него данных недостаточно, зачем нужно запускать воспроизведение которое просто рисует эти данные в окно - неясно), то как без этого обходится функция NET_DVR_CaptureJPEGPicture? мне нужно сделать снимок без отображения видео. сохранять в файл и потом читать его не хочу. JPEG в памяти не устраивает - нужен BMP для последующего масштабирования. пробовал PlayM4_GetJPEG(NET_DVR_GetPlayBackPlayerIndex(), ...) - пока получается бред. функция возвращает ноль. +непонятно как быть с размером буфера. пробовал вызывать с буфером размером в байт что бы получить реальный размер - размер приходит, но вызов функции с буфером этого размера все равно приводит к ошибке. пробовал вычислять размер предварительно вызвав PlayM4_GetPictureSize - не возвращает размеров картины. подсовывал огромный буфер гарантированно вмещающий картину - все равно брыкается.
|
|
|
|
Alexandr | Дата: Понедельник, 25.03.2013, 11:30 | Сообщение # 15 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| а может дело в прошивке девайса ? ведь sdk обновляли для новых аппаратов и не все функции адекватно работают на старых..
|
|
|
|
MaxGomonov | Дата: Понедельник, 25.03.2013, 11:50 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Чтобы получить BMP я делал так: (playHandle - ID, полученный функцией PlayM4_GetPort()) Вызов функции: Код ... var bmp: TBitmap; begin bmp := GetBMP(CAM_PLAYHANDLE); // делаем с bmp все что надо =) end;
Код function GetBMP(playHandle: Longint): TBitmap; var rbs: PDWORD; ps: PChar; i1,i: longint; bSize: DWORD; ms: TMemoryStream; begin try result := TBitmap.Create(); if playHandle < 0 then exit; bSize := 3000000; ms := TMemoryStream.Create; new(ps); GetMem(ps,bSize); new(rbs); if PlayM4_GetBMP(playHandle,ps,bSize,rbs) then begin i1 := rbs^; if i1>100000 then begin ms.WriteBuffer(ps[0],i1); MS.Position:= 0; result.LoadFromStream(ms); end; end; finally FreeMemory(ps); FreeMemory(rbs); ms.Free; ps :=nil; rbs := nil; ms := nil; end; end;
|
|
|
|
vxg | Дата: Понедельник, 25.03.2013, 12:08 | Сообщение # 17 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| bSize := 3000000; как то не по нашему выглядит попробую еще раз
|
|
|
|
MaxGomonov | Дата: Понедельник, 25.03.2013, 12:22 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| =) Согласен По сути, bSize - это максимальный размер буфера, который Вы хотите принять! Я взял с запасом, на 3 мегабайта=) rbs - это фактический размер изображения. Если указать bSize меньше, чем размер изображения реальный, то функция PlayM4_GetBMP вернет false (или ошибку, точно не помню)
|
|
|
|
vxg | Дата: Вторник, 26.03.2013, 11:17 | Сообщение # 19 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| итак, результат. 1 дело не в прошивке - это вызовы функций библиотеки PlayCtrl которая просто обрабатывает поступающий от устройства поток. 2 NET_DVR_GetPlayBackPlayerIndex() у меня всегда возвращает -1. при этом NET_DVR_GetLastError() возвращает 12 (NET_DVR_ORDER_ERROR - API calling order error). таким образом NET_DVR_GetPlayBackPlayerIndex - это не то, что мне нужно. по наивности думал, что штатное воспроизведение идет так же при помощи PlayM4_Play и вызывая NET_DVR_GetPlayBackPlayerIndex мы получаем порт штатного воспроизведения. на самом деле это какой-то другой порт. полагаю это порт воспроизведения файлов функциями NET_DVR_PlayBackByName и NET_DVR_PlayBackByTime. 3 пришлось писать функцию обратного вызова g_RealDataCallBack_V30 которая получает порт, устанавливает режим потока, открывает поток, воспроизводит его и добавляет в него приходящие данные. как и писал MaxGomonov без воспроизведения получить данные не удается. еще один интересный момент. если при разрыве связи не остановить воспроизведение, не закрыть поток и не освободить порт, то при последующем восстановлении связи (если мы получаем новый порт) на экране будет происходить "кошмар": такое впечатление, что воспроизводятся сразу два потока. 4 размера буфера требуемого PlayM4_GetBMP получаю как и планировал при помощи PlayM4_GetPictureSize. размер вычисляется как: sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + w * h * 4 5 сейчас доделываю разбор приходящего BMP. он приходит в таком виде в каком хранится на диске. поэтому приходится считывать строки в обратном порядке. и с цветами какая-то заморочка. подзабыл уже формат Добавлено (26.03.2013, 11:17) --------------------------------------------- удивительные вещи... у меня в среде размер BITMAPFILEHEADER равен 16 когда должен быть 14 и никакие настройки среды над ним не властны. пришлось прописывать размер вручную вместо sizeof(BITMAPFILEHEADER)
|
|
|
|
MaxGomonov | Дата: Вторник, 26.03.2013, 11:59 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| По поводу пункта 3 - я так тоже делаю=) и думаю так правильно, т.к. в мануале китайском так и написано делать Подробнее о формате буфера, который приходит от устройства: Я всю обработку изображений от устройства делаю в функции обратного вызова DisplayCallBack (PlayM4_SetDisplayCallBack). Она срабатывает каждый раз, когда приходят данные (аудио, картинка) от устройства. У функции есть параметры: тип данных, размер и т.п. От моего устройства приходят данные только в формате YV12 Дальше я обрабатываю кадр и перегоняю его в BMP, JPG. Если интересует, могу выложить исходник перекодировки из YV12 в RGB (чтобы с цветом проблем не было)
|
|
|
|
vxg | Дата: Вторник, 26.03.2013, 12:17 | Сообщение # 21 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| ну, я работаю с PlayM4_GetBMP. как я понял из документов он не может вернуть ничего кроме RGBA поэтому голова пока не болит. или может?
|
|
|
|
MaxGomonov | Дата: Вторник, 26.03.2013, 13:18 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| Нет, если получать картинку функцией PlayM4_GetBMP то проблем быть не должно.
|
|
|
|
vxg | Дата: Среда, 27.03.2013, 08:05 | Сообщение # 23 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| вопрос: корректна ли передача в PlayM4_Play hwnd = 0 если мы не хотим что бы у нас рисовалось изображение?
|
|
|
|
MaxGomonov | Дата: Среда, 27.03.2013, 09:23 | Сообщение # 24 |
Группа: Проверенные
Сообщений: 18
Репутация: 2
Статус: Offline
| функция PlayM4_Play допускает передачу ей параметра хендла окна равным "0". Никаких проблем мной замечено не было.
|
|
|
|
vxg | Дата: Среда, 27.03.2013, 10:18 | Сообщение # 25 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| ну, у меня тоже все нормально. просто я опасаюсь что где-то в недрах функции она делает GetDC с переданным мной нулем и получает в качестве контекста рабочий стол. впрочем, раз она на нем не рисует значит она так не делает. просто в документации на эту тему пусто.
Добавлено (27.03.2013, 10:18) --------------------------------------------- обновил свое приложение http://www.hikvision.msk.ru/forum/4-99-3326-16-1354536501 прямая ссылка http://alphacity.netii.net/tree/prjs-web.htm /ipc preview - web-сервер для просмотра видео с IP-камер Hikvision/ теперь забираю картинку через обратный вызов. раньше забирал из окна. процессорное время выделяемое приложению несколько возросло (примерно на 25-30 %). зато теперь ничего не загораживает изображение и можно запускать в невидимом режиме.
|
|
|
|
Alexandr | Дата: Среда, 27.03.2013, 13:22 | Сообщение # 26 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| а вот рискну подкинуть идейку, в родном софте такого нет, но иногда запрашиают: сделать простенький клиент для ip с плавающим окном, только превью. чтобы можно было типа виджета выводить с камеры или рега изображение поверх рабочих приложений пользователя. насчёт платности\бесплатности - на усмотрение разраба естественно) типа домофона на рабочем столе. потом можно нарастить меню с выбором камер из списка )) ну в общем суть вроде понятна.
|
|
|
|
vxg | Дата: Среда, 27.03.2013, 16:29 | Сообщение # 27 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| обозначенная программа кроме всего прочего вроде целиком удовлетворяет этому описанию. разве что добавить пункт "поверх всех окон". Добавлено (27.03.2013, 16:29) --------------------------------------------- ...а вообще дома для таких целей использую браузер. почему бы и нет?
|
|
|
|
Alexandr | Дата: Среда, 27.03.2013, 16:43 | Сообщение # 28 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| несовсем, именно как виджет хочется. т.е. произвольный размер окна , в любом удобном месте док, менять прозрачность при необходимости. ну в общем много чего можно накрутить ) при тревоге моргает и "плюмкает" пускай ) браузер же неудобен в этом плане. вот с камерами проще - в плеер ссылку кинул и вся недолга, почти со всеми вышеперечисленными возможностями.
|
|
|
|
vxg | Дата: Среда, 27.03.2013, 16:57 | Сообщение # 29 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| размер окна произвольный. позиционировать окно пользователь может. прозрачность... сейчас такого нет. тревоги тоже. потому как очень специфичные вещи. а разве речь не о камерах? Добавлено (27.03.2013, 16:57) --------------------------------------------- впрочем, вечером можно набросать вариант. таскаемое за любую точку окно без шапки лежащее поверх всех других с изменяемой прозрачностью. спрятываемое при желании в область рядом с часами. правильно понял? но только без тревоги ибо не работал с таким. а если расширять его камерами - так это получится клон родного софта hk
|
|
|
|
Alexandr | Дата: Среда, 27.03.2013, 18:01 | Сообщение # 30 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| ога) наподобии информера погоды, валюты, etc. сидит некий офис мэн\вумэн и работает со своим штатным офисным (или не очень ) ПО, а в окошке поглядывает идёт начальник или нет по шапке настучать )) в общем то задачка выходит за рамки классики cctv и больше относится к приблудам, потому и написал про виджет. аналогов в штатном ПО нет, на данный момент реализуется через просмотр потокового видео устройств Hikvision, Daum PotPlayer позволяет сделать почти всё вышеперечисленное. но в нём для задачи много лишнего. ну и с тревогами\переговорами у него не выйдет ничего, ведь плеер таки. а тут можно всё это прикрутить, хоть бы и на уровне плагинов впоследствии. уж очень правильная (имхо) идея у TC ) ведь развивать можно и до чата, и до управления замком входной двери\шлагбаума\турникета, ptz. в общем есть куда двигаться )) пс - иногда жалею что забил на программирование )) особенно когда на некоторые "шедевры" натыкаюсь )
|
|
|
|
vxg | Дата: Пятница, 29.03.2013, 10:07 | Сообщение # 31 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| вот результат сегодняшних изысканий. по факту - на существующую прогу наклеил много страз. теперь можно окно таскать за любую точку, менять прозрачность, закреплять поверх всех окон, прятать в трей, убирать шапку, лазать по настройкам (ну, кроме демо режима и режима демона) и перезапускать сервер/подключаться к камере (еще не пробовал). выкладываю для просмотра альфу (только exe файл, корень сервера и dll остались те же - скачивайте по ссылке).
Добавлено (28.03.2013, 16:32) --------------------------------------------- странно, не прикрепляется к сообщению...
Добавлено (28.03.2013, 16:34) --------------------------------------------- залил на свою страницу http://alphacity.netii.net/tree/prjs-web.htm
Добавлено (29.03.2013, 10:07) --------------------------------------------- в связи с некоторыми чудесами выявленными во время тестов так же на сайте существует последняя, ipc_preview_2013_03_26.rar без украшений, стабильная версия.
|
|
|
|
Alexandr | Дата: Понедельник, 01.04.2013, 13:13 | Сообщение # 32 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| направление верное )
|
|
|
|
vxg | Дата: Вторник, 09.04.2013, 23:00 | Сообщение # 33 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| победить возникновение шлейфа за окном при рисовании видео на прозрачной форме не удается ( ... кто-нибудь знает как вообще playm4 делает прорисовку имея в своем распоряжении hwnd? что-то он нехорошее делает от чего окно начинает безумно мигать и оставлять за собой след из фантомов при перетаскивании... Добавлено (04.04.2013, 15:55) --------------------------------------------- ...а если щелкнуть вне окна изображение выводится нормально. но форма становится недоступной для щелчка (как будто был WM_SETREDRAW = FALSE). и в любом случае остается непрозрачной в области вывода изображения. наблюдается только в XP. подозреваю что playm4 рисует на моей форме не синхронизируясь с потоком формы. при включении прозрачности форма пытается вывести фон, а поверх него содержимое. на месте фона оказывается рисованный playm4 кадр. хотя может я ошибаюсь. Добавлено (05.04.2013, 15:53) --------------------------------------------- ...обновил версию на сайте. победить прозрачность в XP не удалось. программа сама отслеживает версию ОС и если она меньше чем у Vista удаляет пункты меню относящиеся к прозрачности в режиме просмотра потока от камеры (в демо-режиме эти пункты доступны). вот такой вот финт ушами. может если когда-нибудь пойму почему оно так елозит отключу эту проверку. Добавлено (09.04.2013, 23:00) --------------------------------------------- любопытно что функция получения BMP в новых версиях SDK возвращает BMP со строками расположенными в ином порядке чем в предыдущей версии SDK
|
|
|
|
Alexandr | Дата: Среда, 10.04.2013, 10:30 | Сообщение # 34 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| ещё можно добавит возможность выбора из нескольких камер, типа "избранного" в IE. а в остальном всё вроде пашет нормально ) что там по условиям использования ? ))
|
|
|
|
vxg | Дата: Четверг, 18.04.2013, 09:51 | Сообщение # 35 |
Группа: Проверенные
Сообщений: 28
Репутация: 1
Статус: Offline
| выложил новую версию. добавлено: список камер, глобальная горячая клавиша показывающая/скрывающая приложение, сохранение рисунков в оригинальном разрешении видео-потока. условия использования: пользуйтесь как угодно вплоть до полного копирования исходного кода в сторонний коммерческий проект Добавлено (18.04.2013, 09:51) --------------------------------------------- отчет о построенной с использованием упомянутой программы системы можно посмотреть на http://habrahabr.ru/post/177071/
|
|
|
|
Alexandr | Дата: Понедельник, 20.05.2013, 14:02 | Сообщение # 36 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| в общем недельный полёт показал стабильную работу, автору респект ) а с прозрачностью под ХП - забить ) это "рюшечки" по большому счёту.
|
|
|
|
vanka | Дата: Четверг, 05.09.2013, 13:46 | Сообщение # 37 |
Группа: Проверенные
Сообщений: 1
Репутация: 0
Статус: Offline
| День добрый!
А не приходилось ли кому прикручивать цифровую стабилизацию к видеопотоку?
Стоит такая задача (камера на подвижном основании). Начал копать, нашел фильтр для AviSynth. Он работает с записанными на диск видеофайлами. Но есть 2 проблемы: 1. Как прикрутить его к видеопотоку (в реальном времени) 2. AviSynth работает со многими форматами, но формат HikVision не понимает. А фильтр который можно поставить для MediaPlayer с AviSynth видимо не работает. Т.е. просто открыть в AviSynth записанное видео в формате HikVision не получается.
Может кто сталкивался с проблемой или знает другие способы решения задачи.
|
|
|
|
Sergei | Дата: Пятница, 06.06.2014, 10:20 | Сообщение # 38 |
Группа: Проверенные
Сообщений: 5
Репутация: 0
Статус: Offline
| Здравствуйте!
Камера DS-2CD2132-I. Логин к камере проходит нормально, а картинки нет. В чем может быть проблема? Подскажите, пожалуйста!
Разобрался.
Сообщение отредактировал Sergei - Пятница, 06.06.2014, 15:35 |
|
|
|
Alexandr | Дата: Понедельник, 07.07.2014, 23:55 | Сообщение # 39 |
Группа: Администраторы
Сообщений: 5345
Репутация: 113
Статус: Offline
| Цитата Sergei ( ) Разобрался. а поделиться ? ))
|
|
|
|
vik7878 | Дата: Суббота, 25.04.2015, 12:44 | Сообщение # 40 |
Группа: Проверенные
Сообщений: 2
Репутация: 0
Статус: Offline
| MaxGomonov, добрй день. Пытался подключится к камере HIKVISION DC-2CD2612F-is. Демка ошибок не выдает, но видео не отображается. В браузере Код http://192.0.0.64/dispatch.asp?user=admin&pass=12345&page=preview.asp[&] видео нормально идет. Подскажите как вывести видео. или хотя бы Битовую картинку в image.
|
|
|
|