Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Раздел содержит статьи по различным тематикам: безопасность и пр.
iTuneDVR
Сообщения: 3218
Зарегистрирован: 24 авг 2013, 11:05

Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Сообщение iTuneDVR » 22 янв 2021, 21:01

Начало темы было здесь http://www.hikvision.msk.ru/forum/23-4233-1 и некоторые продолжения темы на ipcamtalk в частности сегодняшний https://ipcamtalk.com/threads/twoway-audio-problem.25351/#post-522957

Фокус в том, что его никогда и не было. Просто немного терпения при написании кода не имея опыта в этом и отправка заранее правильно подготовленных данных плюс пауза явились залогом успеха. Вся необходимая вводная информация была в постах авторов ищущих решение.
Поднял архив своего исследования вопроса, наступил на все грабли, чтобы все заработало как надо, стилизовал исходник, чтобы не совсем было стыдно, как новичку в этом деле и решил выложить все как есть всем желающим. Настройки аудио G.711ulaw. Под остальные кодеки иные алгоритмы работы и звук не воспроизводится, что естественно. Порадовал себя в прошлый раз консольным вариантов, порадовал и сейчас разбираясь с прошлыми решениями, а кому нужно что-то другое все карты раскрыты в виде рабочего примера.

Код: Выделить всё

/*
 * Copyright(C) iTuneDVR www.iTineDVR.ru @iTuneDVR
 *    FileName: HSWP.cpp
 * Description:
 *     Version: 1.0
 *      Author: iTuneDVR
 * Create Date: 2018-10-22
 * Modification History
 *   2021-01-22 Share for http://ipcamtalk.com/threads/twoway-audio-problem.25351/#post-522957
 */
#include <stdio.h>
#include <fcntl.h>
#include <conio.h>
#include <sys/types.h>
#include <windows.h>
#include "HCNetSDK.h"

inline unsigned long int lof (FILE *file)  {return (filelength (fileno (file)));}                               
void CALLBACK fVoiceDataCallBack(LONG lVoiceComHandle, char *pRecvDataBuffer, DWORD dwBufSize, BYTE byAudioFlag, void *pUser) {}

#define N 160
#define S 20

int main(int argc,char* argv[])
{
   if (argc >= 6) {
   NET_DVR_Init();
   NET_DVR_DEVICEINFO_V30 struDeviceInfo;
   LONG lUserID = NET_DVR_Login_V30(argv[1], atoi(argv[2]), argv[3], argv[4], &struDeviceInfo);
   if (lUserID == -1 ) {
      printf("Login error, %d\n", NET_DVR_GetLastError());
           return -2;
   }
   LONG lVoiceHandle = NET_DVR_StartVoiceCom_MR_V30(lUserID, 1, fVoiceDataCallBack, NULL);
   if (lVoiceHandle < 0) {
           printf("NET_DVR_StartVoiceCom_MR_V30 fail %d\n", NET_DVR_GetLastError());
           NET_DVR_Logout_V30(lUserID);
           return -3;
       }
   FILE *fp1 = fopen(argv[5], "rb");
   if (fp1 == NULL) {
      fprintf(stderr, "Open sound file %s failed\n", argv[5]);
      return -4;   
   }
   int i = lof(fp1);                                  
        char *buffer = (char*)malloc(i + N);                 
   memset(buffer, 0, i + N);
        fread(buffer, 1, i, fp1);                     

//   while (int j=0 <= i) {
   for (int j=0; j<= i;) {
      NET_DVR_VoiceComSendData(lVoiceHandle, buffer, N);
      Sleep(S);
      buffer+=N;
      j+=N;
   }
   free(buffer);
   fclose(fp1);   
   Sleep(S*50);
   NET_DVR_StopVoiceCom(lVoiceHandle);
        NET_DVR_Logout_V30(lUserID);
   NET_DVR_Cleanup();
   return 0;
  }
   printf("Hikvision soundwave player v1.0 (c)iTuneDVR 2018-10-22\nUsage: HSWP.exe 192.168.1.251 8000 admin admin12345 output.wav\n");
}


Версия рабочей и протестированной прошивки и необходимые настройки для камеры
2021-01-22_19-11-43.png

2021-01-22_19-11-52.png

2021-01-22_19-12-17.png


Полный проект сборки с исходниками, библиотеками, скриптами сборки и пояснениями прилагается ;)

20202122_Hikvisin SOUND WAVE PLAYER.zip
(13.94 МБ) 654 скачивания


#Hikvision #TwoWayAudio

ВНИМАНИЕ!!!
Добавлено 20210421
Сборка не содержит компилятор c++ и ffmpeg, поэтому будьте внимательны ;)

Добавлено 20221128
Исправлена ошибка при верстке кода в цикле вывода.
Использовать архив
20221128_Hikvisin SOUND WAVE PLAYER_FIX01.zip
Вложения
20221128_Hikvisin SOUND WAVE PLAYER_FIX01.zip
(13.94 МБ) 190 скачиваний

oleglevsha
Сообщения: 31
Зарегистрирован: 22 янв 2015, 23:39

Re: Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Сообщение oleglevsha » 22 янв 2021, 22:34

Круто, готовая инфраструктура для системы оповещения.

iTuneDVR
Сообщения: 3218
Зарегистрирован: 24 авг 2013, 11:05

Re: Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Сообщение iTuneDVR » 23 янв 2021, 17:26

oleglevsha писал(а):Круто, готовая инфраструктура для системы оповещения.

Это такой, больше вспомогательно-лайтово-костыльный вариант.
Если использовать чисто готовый консольный вариант без переделок, то надо сверху скриптовую обвязку событийную, что и куда и как...
Но, сдать такую систему надзорным органам не получится скорее всего. Просто вспомогательное нечто.
Ну и для офисных задач и иных развлечений ;)

Та же самая задача встраивания в камеру мелодии на реакцию может быть упрощена в плане отсутствия необходимости внедрения в прошивку, что тоже дает некую гибкость и решение разных проблем, переведенных в класс задач ;)

iTuneDVR
Сообщения: 3218
Зарегистрирован: 24 авг 2013, 11:05

Re: Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Сообщение iTuneDVR » 21 апр 2021, 21:02

В продолжение темы.
https://t.me/hikvision_chat/41611
При тесте на своей камере DS-2CD2423G0-I c V5.6.2 build 200722 сборка из проекта проиграла аудио вполне ровно и нормально.
У коллеги оборудование следующее
2021-04-21_19-54-04.png

Проблема оказалась в отсутствие на его ПК компилятора с++ для сборки проекта и ffmpeg для конвертации аудио файлов в нужный формат. Потому и не было звука, а заглянуть в батники как-то...
Да, возможно моё упущение и надо добавить инфу в начало.

Запуск извне, от себя на выставленную наружу камеру проигрывал звук, но немного рвано.
Я посоветовал обновится до моей прошивки и протестировать.
Должно все работать ;)

iTuneDVR
Сообщения: 3218
Зарегистрирован: 24 авг 2013, 11:05

Re: Аудио оповещение через аудиовыход камеры Hikvision (TwoWayAudio)

Сообщение iTuneDVR » 28 ноя 2022, 22:50

Коллега нашел ошибку viewtopic.php?f=34&t=1162&p=7037#p7033
Внесено исправление

Код: Выделить всё

   while (int j=0 <= i) {
      NET_DVR_VoiceComSendData(lVoiceHandle, buffer, N);
      Sleep(S);
      buffer+=N;
      j+=N;
   }


исправить на

Код: Выделить всё

   for (int j=0; j<= i;) {
      NET_DVR_VoiceComSendData(lVoiceHandle, buffer, N);
      Sleep(S);
      buffer+=N;
      j+=N;
   }
Вложения
20221128_Hikvisin SOUND WAVE PLAYER_FIX01.zip
(13.94 МБ) 201 скачивание


Вернуться в «Статьи»