tropicoo / hikvision-camera-bot

Hikvision Telegram Camera Bot 🇺🇦
MIT License
105 stars 24 forks source link

Connecting to multiple cameras with white ip and different ports #55

Closed satsis closed 2 years ago

satsis commented 2 years ago

Подскажите как удалённо подключиться? Во внутренней сети работало. Сервак теперь вне дома. Как подключить если камеры проброшены с разными портами?

What if port forwarding is done and the ports are different? One port is forwarded to 8022 and the other to 8023

"host": "http://141.121.124.216:8023",

or

      "rtsp_port": 555,
      "api": {
        "host": "http://141.121.124.216",
        "port": 8023,

`hikvision-camera-bot_1 | 2022-10-16 13:50:18,542 - [ERROR] - [RecordVideoTask:68] - Failed to validate /tmp/cam_1-2022-Oct-16--13-50-18-wfc6.mp4: File does not exist hikvision-camera-bot_1 | 2022-10-16 13:50:18,543 - [ERROR] - [RecordVideoTask:51] - Failed to record /tmp/cam_1-2022-Oct-16--13-50-18-wfc6.mp4

`

satsis commented 2 years ago

Стрим открывается удалённо через VLC плеер по ссылке rtsp://admin:PASS@195.123.213.13:554/Streaming/Channels/101/

Там где стоит бот ffmpeg -loglevel verbose -i "rtsp://admin:PASS@195.123.213.13:554/Streaming/Channels/101/" -c:v copy -c:a copy -t 10 /tmp/test_cam_video.mp4

ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[tcp @ 0x561e7d693a00] Starting connection attempt to 195.123.213.13 port 554
[tcp @ 0x561e7d693a00] Successfully connected to 195.123.213.13 port 554
[rtsp @ 0x561e7d691700] SDP:
v=0
o=- 1665939201836179 1665939201836179 IN IP4 192.168.0.31
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://195.123.213.13:554/Streaming/Channels/101/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://195.123.213.13:554/Streaming/Channels/101/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z01AKJpXA8ARPywgAADhAAAr8hCA,aPqOIA==
a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000081000000000000000000000000000000;
a=appversion:1.0

[rtsp @ 0x561e7d691700] setting jitter buffer size to 500
[rtsp @ 0x561e7d691700] UDP timeout, retrying with TCP
[rtsp @ 0x561e7d691700] method PAUSE failed: 551 Option not supported
[rtsp @ 0x561e7d691700] Could not find codec parameters for stream 0 (Video: h264, 1 reference frame, none(left)): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, rtsp, from 'rtsp://admin:PASS@195.123.213.13:554/Streaming/Channels/101/':
  Metadata:
    title           : Media Presentation
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264, 1 reference frame, none(left), 90k tbr, 90k tbn, 180k tbc
Output #0, mp4, to '/tmp/test_cam_video.mp4':
Output file #0 does not contain any stream
tropicoo commented 2 years ago

Якщо порт 8023 прокидується на 80-й порт (адмін-панель), то відповідно вам ще треба прокинути і на RTSP-порт 554. Загалом, треба щоб запрацювала команда ffmpeg:

ffmpeg -loglevel verbose -i "rtsp://admin:PASS@195.123.213.13:554/Streaming/Channels/101/" -c:v copy -c:a copy -t 10 /tmp/test_cam_video.mp4

А конкретно ця не працює мабуть тому, що порт 554 ззовні недоступний.

satsis commented 2 years ago

Якщо порт 8023 прокидується на 80-й порт (адмін-панель), то відповідно вам ще треба прокинути і на RTSP-порт 554. Загалом, треба щоб запрацювала команда ffmpeg:

Справа в тому, що відео працює нормально будь де. На телефоні бо в программі на компі. Порти прокунуті. rtsp://admin:PASS@195.123.213.13:554/Streaming/Channels/101/ цю ссилку я відкриваю с іншого міста в vlc плеері і вона працює. бот кидає скрини по команді. Він не пише відео. у другій мессагі я скинув лог команди В мене прокинуті порти и на веб и на RTSP - tcp

tropicoo commented 2 years ago

А якщо спробувати прямо вказати -rtsp_transport tcp?

ffmpeg -loglevel verbose -rtsp_transport tcp -i "rtsp://..."
satsis commented 2 years ago

Output #0, mp4, to '/tmp/test_cam_video.mp4': Metadata: title : Media Presentation encoder : Lavf58.29.100 Stream #0:0: Video: h264 (Main), 1 reference frame (avc1 / 0x31637661), yuv420p(progressive, left), 1920x1080 (0x0), q=2-31, 25 fps, 25 tbr, 90k tbn, 90k tbc Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help [mp4 @ 0x55941d592040] Non-monotonous DTS in output stream 0:0; previous: 0, current: -18000; changing to 1. This may result in incorrect timestamps in the output file. [mp4 @ 0x55941d592040] Non-monotonous DTS in output stream 0:0; previous: 1, current: -14400; changing to 2. This may result in incorrect timestamps in the output file.

Так пише.

tropicoo commented 2 years ago

А у вас остання версія бота, чи котрась із попередніх? Оскільки зараз в боті при записі такого відео цей параметр -rtsp_transport обов'язковий і береться з конфігу (по замовчуванню tcp).

# Video Gif Command. Hardcoded aac audio to mitigate any issues regarding
# supported formats for mp4 container.
FFMPEG_CMD_VIDEO_GIF = (
    f'{_FFMPEG_BIN} {_FFMPEG_LOG_LEVEL} '
    '{rtsp_transport} '
    '-i {video_source} '
    '-c:v copy -c:a aac '
    '-t {rec_time} '
    '{filepath}'
)
satsis commented 2 years ago

Стара версія була. Що таке api_id and api_hash strings to the same keys ? Дуже багато незрозумілого для мене. Як оновити, навіщо оці параметри і де їх брати.

tropicoo commented 2 years ago

Там одразу посилання в тексті. Коли зайдете, вони будуть показані на сторінці. Це потрібно для бібліотеки, котра працює з АРІ телеграму напряму, тому може завантажувати місткі файли до 2гб (якщо ви преміум користувач, то ще більші).

Наприклад, якщо ви будете використовувати функціонал DVR, то він може вам аплоадити відео з ваших камер у вашу телеграм групу, в якій буде бот.

satsis commented 2 years ago

Creating hikvision_srs_server ... error

ERROR: for hikvision_srs_server Cannot start service hikvision-srs-server: driver failed programming external connectivity on endpoint hikvision_srs_server (8f9c2029889bc8c35f96a8010305a1ed80bb2ad4a1eae946b6ca44e457f9bad2): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use

ERROR: for hikvision-srs-server Cannot start service hikvision-srs-server: driver failed programming external connectivity on endpoint hikvision_srs_server (8f9c2029889bc8c35f96a8010305a1ed80bb2ad4a1eae946b6ca44e457f9bad2): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use ERROR: Encountered errors while bringing up the project.

tropicoo commented 2 years ago

Порт 8080 вже кимось зайнятий, можете змінити тут https://github.com/tropicoo/hikvision-camera-bot/blob/master/docker-compose.yml на 8081 (в самому кінці файлу, там де 8080 до двокрапки)

satsis commented 2 years ago

Нова версія бота кидає чомусь по 2 скрина і також 2 скрина високої якості по команді. і все также не робить запис відео

hikvision_camera_bot | 2022-10-17 01:03:32,724 - [DEBUG] - [OutboundEventDispatcher:33] - Outbound event: SendTextOutboundEvent(event=<Event.SEND_TEXT: 'send_text'>, text='Failed to record /tmp/cam_1-2022-Oct-17--01-03-32-r6x4.mp4 on Podyezd.\nEvent type: record_videogif\nCheck logs.', parse_mode=pyrogram.enums.ParseMode.HTML, message=pyrogram.types.Message

tropicoo commented 2 years ago

А це вже дивно, там ще інші логи мають бути, від ffmpeg, чому запис відвалився.

Можливо також скиньте ваш конфіг, лише логін/пароль приберіть і айпі камер

satsis commented 2 years ago

А це вже дивно, там ще інші логи мають бути, від ffmpeg, чому запис відвалився.

Можливо також скиньте ваш конфіг, лише логін/пароль приберіть і айпі камер

hikvision_camera_bot | 2022-10-17 01:03:32,583 - [INFO] - [asyncio:1640] - run shell command 'ffmpeg -loglevel error -rtsp_transport tcp -i "rtsp://log:pass@host:8882:555/Streaming/Channels/101/" -c:v copy -c:a aac -t 10 /tmp/cam_1-2022-Oct-17--01-03-32-r6x4.mp4': <_UnixSubprocessTransport pid=14 running>

смущает 2 порта сразу в логе

satsis commented 2 years ago

Як правильно вказати порт веб, якщо він інакший? в цьому і була проблема схоже.

tropicoo commented 2 years ago

Без веб порта у вас працює відео, проте не працюють фото і навпаки?

satsis commented 2 years ago

Без веб порта у вас працює відео, проте не працюють фото і навпаки?

так

satsis commented 2 years ago

І підкажіть як правильно зупинити все, щоб перечитати новий конфіг

tropicoo commented 2 years ago

Щодо порта, я завтра впиляю новий конфіг-параметер, а зараз можна спробувати змінити цю 13-ту лінійку https://github.com/tropicoo/hikvision-camera-bot/blob/69c3ae1e80cc358b7e9f16c86ee16b61be366d53/hikcamerabot/clients/hikvision/enums.py#L13

PICTURE = ":8882/ISAPI/…

А зупинити все це в терміналі docker-compose stop -t 0, потім так як в інструкції запускаєте

satsis commented 2 years ago

Так не вийде. В мене дві камери. Краще завтра візьму обнову. Дякую.

satsis commented 2 years ago

І чому шле по дві мессаги? Одна с помилкою, друга з відео. Як відключити chat_users ? Може питання в тому, що однакові id у параметрах chat_users, alert_users, startup_message_users ?

tropicoo commented 2 years ago

Не повинно слати дві месаги, щось відбувається не так. В логах повинно писати всі дії, коли щось відбулось не так, якщо память не підводить.

Чат юзерс і решта по факту повинні містити айдішку вашого юзера, воно розділено на три змінні, бо я, наприклад, шлю алерти в окрему групу, а коли рестартую, не хочу щоб воно слало стартап меседж в ту групу, а лише персонально мені.

satsis commented 2 years ago

PICTURE = ':{port}ISAPI/Streaming/channels/102/picture?snapShotImageType=JPEG'

"rtsp_port": 555,
"port": 8882,

тут я зробив так і робить. Но так і є проблема с подвійними мессагами

satsis commented 2 years ago

Мені знається що я не зупинив старий скрипт і він якось робе у фоні. Навіть після ребуту. Треба ждати ваш фікс і підкажіть як все вбити щоб не робило в фоні

tropicoo commented 2 years ago

В терміналі заходите в папку з ботом, пишете docker-compose stop -t 0, а потім docker ps і дивитесь, чи контейнер з ботом виконується. Його там немає бути.

satsis commented 2 years ago

Дякую. Другий контейнер прибив. Буду чекати фікс, бо управління і картинки не роблять. Тіки відео. Треба виносити порт управління окремо в конфіг.

tropicoo commented 2 years ago

Пробуйте оновитись

tropicoo commented 2 years ago

Щодо двійних меседжів - якщо в логах немає нічого підозрілого, то для експерименту можна видалити ось цю лінійку і перезапустити. В теорії, при дублікатному меседжі в логах у вас буде помилка, а в телеграмі не дублікатне фото чи відео.

Якщо так, це проблема бібліотеки, котра працює з телеграм АРІ, або проблема з самим телеграм АРІ, котре може дропнути чи резетнути з'єднання не приславши відповідь назад, хоча контент вам доставить.

https://github.com/tropicoo/hikvision-camera-bot/blob/11dbdba8dd2245a9e854c9d91b944b11c61ea489/hikcamerabot/clients/hikvision/api_client.py#L31

satsis commented 2 years ago

Щодо двійних меседжів - якщо в логах немає нічого підозрілого, то для експерименту можна видалити ось цю лінійку і перезапустити. В теорії, при дублікатному меседжі в логах у вас буде помилка, а в телеграмі не дублікатне фото чи відео.

Це був мій косяк. Я не прибив старий контейнер докера і він працював надалі. Я закинув новій скрипт і створив новий контейнер. Запускав ще одну копію з іншим конфігом.

Бот запрацював. Але не роблять команди /md_on_cam_1 /md_off_cam_1 /ld_on_cam_1 /ld_off_cam_1

/tg_on_cam_1 - робе. Telegram stream successfully enabled

На старої версії робило.

satsis commented 2 years ago

hikvision_camera_bot | 2022-10-17 16:09:49,491 - [ERROR] - [ServiceAlarmMonitoringTask:40] - Failed to connect to cam_1 alert stream. Retrying in 0.5 seconds...

tropicoo commented 2 years ago

Спробуйте оновитись

satsis commented 2 years ago

Дуже дякую. Команди запрацювали. Но в логах помилка не зникла. hikvision_camera_bot | 2022-10-17 22:39:13,184 - [ERROR] - [ServiceAlarmMonitoringTask:40] - Failed to connect to cam_1 alert stream. Retrying in 0.5 seconds... hikvision_camera_bot | 2022-10-17 22:39:13,686 - [INFO] - [ServiceAlarmMonitoringTask:27] - Starting alert pusher task for camera: "Podyezd"

Не працює по руху (

tropicoo commented 2 years ago

Спробуйте ще раз оновити

satsis commented 2 years ago

Велике дякую!!! На перший погляд супер. Помилок в логах немає. Відео прийшло по детекції руху.

Якщо буде хвилина, розкажіть будь ласка про трансляцію в групу телеграм. Яким чином транслює і як буде віглядати? Це постійне відео чи кусками? В чому різниця від 10 секундних роліків?

satsis commented 2 years ago

І як це відрубити? 🚨 Alert on "cam_1 - Podyezd": Motion Detection те що приходить без відео.

tropicoo commented 2 years ago

Стрім в телеграм працює як і будь-який стрім - береться відео-потік з камери і відсилається на телеграм сервер, який прописаний в livestream-templates.json:

  "telegram": {
    "tpl_kitchen": {
      "channel": 101,
      "restart_period": 39600,
      "restart_pause": 1,
      "url": "rtmps://dc4-1.rtmp.t.me/s",
      "key": "xxxx-xxxx-xxxx-xxxx"
    },
    "tpl_basement": {
      "channel": 101,
      "restart_period": 39600,
      "restart_pause": 1,
      "url": "rtmps://dc4-1.rtmp.t.me/s",
      "key": "xxxx-xxxx-xxxx-xxxx"
    }
  },

Спершу треба в самій групі стартувати стрім (там покаже ваш персональний ключ, котрий потрібно прописати в key) і лише після цього включити в боті.

Там є приколи з цим - на різних камерах відео-потік енкодається з різними параметрами і є такі, котрі телеграм не підтримує і треба робити повний ре-енкодінг, що являється ресурсоємким процесом для пристрою, на якому крутиться бот. Наприклад, якщо ваша камера видає відео-потік з pixel format yuvj420p, то телеграм не буде показувати відео, лише якщо буде yuv420p. У вас, судячи по всьому, yuv420p, значить повезло.

По замовчуванню відео- та аудіо-потік з камери просто копіюється "as is" на rtmp-сервер телеграму. А там вже вам або покаже відео, або ні.

Можна пробувати міняти опції в encoding-templates.json для телеграму, наприклад замінити "acodec": "copy" на "acodec": "aac", якщо не допомогло, значить проблема в відео.

{"direct":
    "kitchen_telegram": {
      "null_audio": false,
      "loglevel": "error",
      "vcodec": "copy",
      "acodec": "copy",
      "asample_rate": -1,
      "format": "flv",
      "rtsp_transport_type": "tcp"
    },
}
tropicoo commented 2 years ago

І як це відрубити? 🚨 Alert on "cam_1 - Podyezd": Motion Detection те що приходить без відео.

Треба нову змінну в конфіг

tropicoo commented 2 years ago

Також є SRS (рестрім-сервер), який включається в конфігу. Ваша камера це сервер на слабкому залізі, відповідно, якщо ви законектитесь до камери декількома процесами ffmpeg (наприклад стрім на ютуб, стрім в телеграм групу та відео-алерти), то камера може підвиснути і ffmpeg-процеси повилітають і будуть перезапущені.

Суть SRS-сервера в контексті бота конектитись до вашої камери і брати звідти відео-потік без ре-енкодінга, далі всі інші ffmpeg-процеси конектяться на цей сервер і беруть звідти відео-потік, він спеціально заточений на такі штуки і все працює майже без навантаження на процесор. В результаті камера не висне і можна стрімити куди завгодно.

tropicoo commented 2 years ago

https://github.com/tropicoo/hikvision-camera-bot/blob/master/releases/release_1.6.md

satsis commented 2 years ago

Дуже дякую за пояснення. Телеграм працює. Перевірив трансляцію. Все добре. Тілки ключа дає с ПК, с телефона ні. Алерти відключив.

Є питання по цьому

      "video_gif": {
        "on_demand": {
          "channel": 101,
          "record_time": 10,
          "rewind_time": 10,
          "tmp_storage": "/tmp",
          "loglevel": "quiet",
          "rtsp_transport_type": "tcp"
        },
        "on_alert": {
          "channel": 101,
          "record_time": 10,
          "rewind_time": 10,
          "rewind": false,
          "tmp_storage": "/tmp",
          "loglevel": "quiet",
          "rtsp_transport_type": "tcp"
        }

Одна камера вмене по детекції, друга по лінії Якщо по лінії то пише роліки 10 секунд один (як треба) Якщо по детекції то пише 20 сек та 2 поспіль.

Раніше на старой версії писало по 10 і там і там.

tropicoo commented 2 years ago
  1. Подивіться чи всюди виключений rewind. Це коли на SRS-сервері ~10 секунд кешуються в HLS-stream і можна отримати відео на 20 секунд (10 перед детекшном і 10 після як у вас в конфігу, де сам детекшн буде по середині відео). Там ще є команда /getvideor_cam_1 яка в теорії просто покаже вам відео "з минулого" і "поточного".
  2. Подивіться, що робиться в логах з процесами ffmpeg, чи немає додаткових.
  3. Є ще така опція як delay, скільки секунд чекати між повторним тригером алерта. Тобто спрацював моушн детекшн, ми стартуємо запис відео і 15 секунд ігноруємо повторні алерти (камера спамить ними алерт-стрім) і потім знову пишемо і так по колу, поки алерт-стрім перестане містити детекшн-алерт.
      "alert": {
        "delay": 15,

В себе я щойно перевірив, мені шле по 1 відео що лінія, що моушн.

satsis commented 2 years ago

Дякую. Мабудь так и є.

Я так розумію вмене стартували одразу і детекція і лінія на одній камері хоча в конфігу так

      "alert": {
        "delay": 15,
        "motion_detection": {
          "enabled": true,
          "sendpic": false,
          "fullpic": false,
          "send_videogif": true,
          "send_text": false
        },
        "line_crossing_detection": {
          "enabled": false,
          "sendpic": false,
          "fullpic": false,
          "send_videogif": true,
          "send_text": false
        },

і ще буває така помилка при старті

hikvision_camera_bot | 2022-10-18 12:54:17,407 - [WARNING] - [asyncio:1894] - Executing <Task pending name='Task-1' coro=<main() running at /app/./bot.py:12> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.10/asyncio/futures.py:385, Task.task_wakeup()] created at /usr/local/lib/python3.10/asyncio/base_events.py:429> cb=[_run_until_complete_cb() at /usr/local/lib/python3.10/asyncio/base_events.py:184] created at /usr/local/lib/python3.10/asyncio/tasks.py:636> took 0.277 seconds

tropicoo commented 2 years ago

Це не помилка, все нормально

satsis commented 2 years ago

Дуже дякую за все. Здоров'я мирного неба!