Linux видеорегистратор h 264

Исследование потока с китайского видеорегистратора

Приветствую спецов! Возникла проблемка, надеюсь, смогу тут найти подсказку, в каком направлении копать. Краткая предыстория ниже (осторожно, многобукав).

Задача: вывод куда-нибудь (да хоть в mplayer) видеопотока с дешёвого китайского четырёхканального h264-видеорегистратора с целью просмотра в реальном времени и последующей его записью.

Проблема: регистратор вещает в своём собственном формате. Просмотреть картинки с камер можно только через специальную виндовую прогу (DVRemote.exe) либо через EI7 с какой-то гнилой ботвой на ActiveX. Записываются файлы с него тоже в непонятном и мало изученном (но, как я понял, популярном в подобных регистраторах) формате с расширением .irf. Кругом засада.

Что уже сделано: с помощью wireshark’а на регистраторе обнаружено приложение cgi-bin, которое выдаёт поток, а так-же исследованы его (приложения) параметры. С помощью функции проводной акулы «Follow stream» записаны сеансы общения через 80й порт (на иных портах активности не наблюдалось) между родным ПО и регистратором.

Таким нехитрым образом были обнаружены посылки управления (переключение каналов, управление PTZ и т.д.), разобрать которые не составило труда. Далее отбирались те tcp-потоки, в которых был запрос GET к этому cgi-скрипту и ответ HTTP/1.0 200 OK; Content-type: video/h264. Затем в двоичном редакторе происходило разделение заголовков http и, собственно, потока, получившиеся файлы были сохранены на диск в формате «как есть» (raw) и скормлены mplayer’у. Без особого успеха.

Но в один прекрасный момент был записан фрагмент, в котором видно проскакивающие кадры одной из камер в перемешку с синим video-loss-экраном (два канала не подключены) и сильными помехами (очевидно, следствие подмешивания в поток каких-то служебных данных либо мультиплексирование сигналов со всех четырёх каналов в этот единый поток). Данный фрагмент доступен для загрузки тут, 2.3 мб: http://tfsoft.org.ua/

Конкретные вопросы: насколько велики шансы за разумный период времени извлечь нормальный видеопоток из этой каши? По сути, всё управление (переключение каналов, управление трансфокатором и фокусом камер) уже есть, осталось лишь картинку получить.

Если я правильно понимаю, мне нужно обнаружить записи Sequence Parameter Set и Picture Parameter Set, чтоб иметь представление о потоке, но как и где их искать? Во внутренностях h264 не шарю почти ничего.

Источник

Большой брат в Linux или видеонаблюдение своими руками

Большой брат в Linux или видеонаблюдение своими руками.

После переезда в новый офис, дабы не расслаблять сотрудников, было решено
установить систему видеонаблюдения. Но, как обычно, основным условием было:
дешево и сердито 🙂 После обдумывания и подсчетов было решено остановиться на
следующем:
IP камеры и компьютер в качестве регистратора.
Для начала попробовали небезызвестный ZoneMinder. Но отчего-то с 9 камерами он
грузил систему нещадно. После некоторой борьбы с ним, было решено отказаться от
него. Поискав на просторах Internet была найдена программка под названием
motion (http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome). Почитав немного
про нее, было решено остановиться на ней.
Итак, у нас были IP камеры, компьютер в качестве регистратора, motion в
качестве софта и желание подружить весь этот колхоз 🙂
И что же умеет motion из того, что нам надо? 🙂
1. Работа с камерами, подключенными через карты захвата либо с IP камерами.
2. Выполнять скрипты при наступлении и окончании события.

Ну чтож, приступим. Для начала попробуем с одной камерой 🙂
Устанавливаем motion.
Далее, в папке /etc/motion/ копируем файл с конфигурацией (motion.conf) в файл
для нашей камеры, например motion1.conf. А теперь начинаем его править под
себя:
1. закомментируем строчку
videodevice /dev/video0
2. в строке netcam_url прописываем URL для доступа к нашей камере. Мы
использовали IP камеры Axis, модель 207 (со встроенным микрофоном).
Для нашего случая выглядело так:
netcam_url
http://camera_ip/axis-cgi/mjpg/video.cgi?resolution=640×480
где camera_ip — IP адрес камеры 🙂
3. далее находим строку target_dir — здесь указываем путь к папке, где будем
хранить данные с камеры.
4. а теперь начинается самое интересное. Находим строку on_event_start. Здесь
мы прописываем команду, которая будет выполняться при наступлении события, то
есть при движении. Что нам это дает? А дает нам это то, что мы не будем
постояно вести запись, а только по необходимости — есть движение, идет запись,
закончилось, остановились и мы. Таким образом получается экономия. Для
сравнения — у нас ведется запись с 10 камер — цветная картинка 640х480 со
звуком, записи хранятся 21 день и все это дело занимает на диске в среднем 135
GB, а всесте с фото, которые делает motion около 200 GB.
5. следующая строка: on_event_end — это для команды, отрабатывающей по
окончанию события.
6. И еще один нюанс, motion поднимает небольшой http сервер, а так как для
каждой камеры запускается своя инстанция программы с отдельным конфигом, то
важно, чтобы он слушал на разных портах. Для этого проверяем, чтобы следующие
строки отличались в каждом файле:
webcam_port и control_port
Для примера: для первой камеры ставим значения
webcam_port 8081
control_port 8080
для второй
webcam_port 8083
control_port 8082
и так далее.

Читайте также:  Mac os оконный менеджер

Это в принципе основные изменения. Думаю при внимательном прочтении конфига вы
сами найдете нужные вам параметры, так как там все довольно хорошо
задокументировано.

Теперь вернемся к скриптам, которые отрабатывают при начале и окончании
события.
Так как нам надо писать видео с камеры, то для этого я использовал mencoder.
В папке /root/bin/ создаем скрипты recordstart.sh и recordstop.sh, которые
будут запускаться при наступлеии и окончании события соответсвенно.
Давайте заглянем внутрь recordstart.sh:

[root@video bin]# cat /root/bin/recordstart.sh
#!/bin/bash

# We are using two variables
# 1 — camera name
# 2 — directory name (where file will be stored)

# Generate filename
start=«cam$<1>»
dt=`date +%Y%m%d%H%M%S`
FILENAME=»$-$

.avi»
echo $FILENAME

if [ «$1» -eq 218 ]
then
`/usr/bin/mencoder -ovc copy -oac pcm -delay 1.5 -mc 10 -o
/video/motion/$2/$FILENAME rtsp://192.168.95.218/mpeg4/media.amp > /dev/null`
elif [ «$1» -eq 219 ]
then
`/usr/bin/mencoder -ovc copy -oac pcm -delay 1.5 -mc 10 -o
/video/motion/$2/$FILENAME rtsp://192.168.95.219/mpeg4/media.amp > /dev/null`
else
`/usr/bin/mencoder -ovc copy -oac pcm -mc 10 -o /video/motion/$2/$FILENAME
rtsp://192.168.95.$1/mpeg4/media.amp > /dev/null`
fi

Скрипт принимает два параметра:
1 — имя камеры, хотя имя не совсем верно, так как это последний октет из IP
адреса камеры. То есть, как в нашем случае (мы используем 95 подсеть — 192.168.95.0/24). Таким образом, при передаче значения 211 — будет ясно, что
хотим обратиться к камере с IP 192.168.95.211
2 — директория, где будет храниться записанный файл. Сделано для того, чтобы
легче было искать. Опять же в нашем случае: имеется папка /video/motion в
которой хранятся записи, но для того, чтобы не мешать все в кучу, она содержит
поддиректории зон: kuhnya, balkon и т.д. Значит при передаче значения balcon — запись будеть производиться в директорию /video/motion/balkon.

Итак, при вызове скрипта в виде /root/bin/recordstart.sh 211 balkon — скрипт
будет писать с камеры с IP 192.168.95.211 в директорию /video/motion/balkon.
Надеюсь тут все более-неменее ясно 🙂

Как видно, вначале мы генерируем уникальное имя для файла, в который будем
писать, которое состоит из следующих частей:
start — номер камеры, вернее последний октет из ее IP с предшествующим ей cam.
dt — текущая дата в формате ГГГГММДДччммсс.
Пример имени файла: cam218-20090924131847.avi — то есть, пишется с камеры с IP
192.168.95.218, дата начала: 2009 год, 09 месяц, 24 число, 13 часов, 18 минут,
47 секунд.

Небольшое пояснение: так уж оказалось, что у нас разные модели камер, которые
предоставляют разные способы доступа к потоку видео данных, из-за этого
пришлось ввести в скрипте проверки.
Теперь пройдемся по mencoder-у:
-ovc copy — означает, что видеоряд копируем, так как с камеры сразу идет в
mpeg4
-oac pcm — какой кодек использовать для звуковой дорожки, если камера позволяет
писать звук.
-mc 10 — Максимальная величина корректировки A-V синхронизации на один кадр (в
секундах)
-delay 1.5 — Задержка в мс, которая должна вноситься в каждый канал

Если у вас проблемы с синхронизацией видео и звукового ряда, тогда надо менять
значения для последних двух параметров — mc и delay.
Для теста можно использовать mplayer.

Ну вот, теперь при наступлении события, мы можем запускать данный скрипт.
Таким образом в конфиге для motion для нашей камеры прописываем в строке
on_event_start что-то похожее:
on_event_start «/root/bin/recordstart.sh 210 koridor1»

И он начнет писать :)))
Но ведь это все еще надо остановить :)))
Для этого используем второй скрипт /root/bin/recordstop.sh.

[root@video bin]# cat /root/bin/recordstop.sh
#!/bin/bash

# We are using one variable
# 1 — camera name

# Get string with mencoder process PID
MPID=`ps ax | grep mencoder | grep cam$ <1>| awk ‘< print $1 >‘`

# Kill process
`kill -15 $MPID`

Скрипт принимает один параметр — все тот же последний октет из IP адреса
камеры.

Соответсвенно в строке on_event_end файла конфигурации прописываем что-то
вроде:
on_event_end «/root/bin/recordstop.sh 210»

Ну вот примерно и все, что касается конфигурации.
Теперь перейдем к рутинным операциям 🙂
У меня используются две, которые отрабатывают по крону.
1. Удаляет устаревшие файлы, которые страрше 21 дня.
2. Объединяет все файлы за день в один.

Читайте также:  Что делать если не удалось запустить службу центра обеспечения безопасности windows 10

Рассмотрим скрипт для чистки. У меня он располагается в директории /root/sbin
и,
для того, чтобы враги не догадались, называется clean.sh

]# cat /root/sbin/clean.sh
#!/bin/sh

/bin/find /video/balkon -name «*.*» -mtime +21 -delete
/bin/find /video/motion/balkon -name «*.*» -mtime +21 -delete

В первой директории хранятся фотографии, сделанные motion — это параметр из
файла конфигурации в строке target_dir.
Вторая директория — куда пишется видео, запущенное из скрипта recordstart.sh

А вот второй скрипт посложнее.
[root@video

]# cat /root/sbin/concatfiles.py
import os, stat, types, commands

workDir = ‘/video/motion/’
dirs = os.listdir(workDir)
oldDate = summaryFile = summaryFileTmp = »
for dir in dirs:
filesList = os.listdir(workDir + dir)
filesList.sort()
for file in filesList:
tmpN = file.split(‘.’)
nm = tmpN[0]
tmpN = nm.split(‘-‘)
if tmpN[0] != ‘S’:
nm = tmpN[1]
year = nm[0:4]
month = nm[4:6]
day = nm[6:8]
date = year + month + day
if oldDate != date:
summaryFile = workDir + dir + ‘/S-‘ + tmpN[0] + ‘-‘ + year +
month + day + ‘.avi’
summaryFileTmp = workDir + dir + ‘/S-‘ + tmpN[0] + ‘-‘ + year +
month + day + ‘-tmp.avi’
#conactenate files
command = ‘/usr/bin/mencoder -oac copy -ovc copy ‘ + workDir +
dir + ‘/’ + tmpN[0] + ‘-‘ + date + ‘*.avi -o ‘ + summaryFileTmp
os.system(command)
#fix key frame
command = ‘ffmpeg -i ‘ + summaryFileTmp + ‘ -ss 0.04 -vcodec
copy -acodec copy -vcodec copy -acodec copy ‘ + summaryFile
os.system(command)
#remove tmp file
command = ‘/bin/rm -f ‘ + summaryFileTmp
os.system(command)
#remove old files
command = ‘/bin/rm -f ‘ + workDir + dir + ‘/’+ tmpN[0] + ‘-‘ +
date + ‘*.avi’
os.system(command)
oldDate = date

Это для объединения коротких роликов за день в один суммарный. (Для тех кто не
в курсе — он на питоне).
Единственное, что нужно менять — это переменная workDir — путь, куда mencoder
пишет свои файлы, все из того же recordstart.sh

Прописываем их в крон на выполнение раз в сутки, желательно ночью, пока карета
не превратится в тыкву 🙂

Запускаем motion следующим образом:
motion -c /path/to/config/file

где
/path/to/config/file — путь к нашему файлу с конфигом 🙂

А далее запускаем их при загрузке системы.

Ну вот наверное и все 🙂
Если будут вопросы — задавайте 🙂

UPD: будьте внимательны с скриптом на питоне, так как сбилась вся
табуляция, что для него очень критично.

Источник

LinuxDVR — программа для видеонаблюдения под Linux, скачать, инструкция по настройкам

LinuxDVR — программа для видеонаблюдения под Linux, скачать, инструкция по настройкам

Основные возможности и характеристики ПО LinuxDVR.

  • Можно построить одиночный в/регистратор или распределенную систему (передача видео основана на стандартном протоколе Motion JPEG c гибкими настройками такой передачи для подстройки к реальной сети);
  • на одном ПК поддерживает до 32 аналоговых CCTV ч/б или цв. в/к с композитным видеосигналом (подключение через 2 PCI платы видеозахвата по 16 каналов каждая);
  • поддерживает сетевые камеры и видео-сервера по протоколу Motion JPEG (MJPEG);
  • допустимые разрешения: аналоговые в/к — до 768×576(полный кадр) , сетевые в/к — до мегапиксельного 1600х1200 ;
  • запись в файлы JPEG, видеофильмы MPG(MPEG1), и AVI (кодеки MJPEG и MPEG4);
  • детектор движения ;
  • реакции на события;
  • неограниченное ( прим: программно ) кол-во удаленных рабочих мест наблюдения, администратора, оператора архива ;
  • поиск по архиву видеозаписей по различным критериям;
  • протоколирование событий — ни одна попытка доступа и ни одно изменение в настройках системы не останутся незамеченными;
  • удаленный доступ по протоколам HTTP, FTP, TELNET ;
  • резервное копирование (backup) по протоколу RSYNC ;
  • синхронизация времени узлов распределенной системы с центральным сервером по протоколу TIME

Основные преимущества.

Специальный дистрибутив Linux (около 17 Mb) на базе ядра 2.4 обеспечивает:

  1. Высокую производительность и минимальные требования к аппаратному обеспечению. Это обеспечивается за счет оптимизации всех компонентов ПО — ядро linux, основные раб. программы под конретные классы процессоров (так где нужно исп. MMX, SSE, SSE2).
  2. Систему не нужно устанавливать (ОС, драйвера, тюнинг). Процессы установки нужны только для подготовки загрузки c HDD (если нужно) и места под архив (это обязательно, если нужна запись на диск).
  3. Основные работа с пользователем — через браузер. Вам не нужно устанавливать и настраивать дополнительного ПО.
  4. Защиту от вирусов (более правильно — вирусы для Linux большая редкость).
  5. Защиту от «шаловливых ручек» — в системе установлено только то ПО, которое необходимо для работы. Нет игр и не возможно ничего установить.
  6. Возможность запуска ПО прямо с CD-ROM (ПО копируется в память и начинает работать) обеспечивает требования для самых критичных систем, таких как сетевые экраны.
  7. Быстрая загрузка после аварийного отключения питания (менее 60сек) и автоматическое восстановление архива и базы (длительность в зависимости от диского пространства).
  8. Не нужно платить за ОС Microsoft Windows (для многих россиян, конечно, пока не сильное преимущество :).
Читайте также:  Как разблокировать компьютер с диском windows

Простота и скорость расширения системы.

Как правило подобные системы включают аппаратных ключ защиты — HASP LPT или USB ключ.

Это значит, что если Вы хотите подключить дополнительные видеокамеры, то Вам после оплаты придется обмениваться ключами с производителем по почте или др. способом. Т.е. ждать.

Наш ключ защиты — программный. Заплатили за расширение тут же получили файл ключа по электронной почте и легко установили в работающую систему систему.

Поддержка недорогих и распространенных плат видеозахвата и TV-тюнеров.

Карты видеозахвата для подключения обычных в/к с композитным видеовыходом выбирались нами по принципу цены и доступности на рынке. Есть модели, которые можно заказать в ближайших компьютерных магазинах Вашего города.

Поддержка вебкамер и наблюдение через интернет.

Наблюдение с использованием web-камер распространяется пропорционально развитию компьютерных сетей и интернет и, без сомнения, в недалеком будущем станет преобладать над традиционным аналоговым.

Уже сейчас видеошлюзы и вебкамеры работают на многих объектах. Потому что это недорого, просто и зачастую единственный экономически оправданный путь построения распределенных системы типа «Безопасный город» и подобных.

Поэтому LinuxDVR работает с большим кол-вом моделей интернет камер и видеосерверов (видеошлюзов).

100% управление через Web-интерфейс.

Все функции системы в том числе и основные: наблюдение, управление, настройка и просмотр архива имеют веб-интерфейс.

Т.е. возможно создание автономных безмониторных видеорегистраторов для работы с которыми Вам нужен только Ваш любимый ПК и веб-браузер (Microsoft Internet Explorer v5.5 и выше, Mozilla Firefox, Mozilla, Netscape Navigator).

Доступ по имени и паролю с разрешенных компьютеров. Групп пользователей — 4 (инсталляторы, администраторы, операторы архива, операторы наблюдения).

Количество пользователей программно не ограничено.

Такой принцип взаимодействия ПО позволяет организовывать безголовые (безмониторные) автономные видеорегистраторы и удаленные системы наблюдения.

Инструкция по рабьоте с программой LinuxDVR

По умолчанию, после установки системы, в базе настроены только 4 в/к — 4 канала на одной одночиповой (BT878) 4-x канальной плате видеозахвата. То есть, при установке, мастер установки LinuxDVR может найти все устройства (платы) видеоввода, но в конфигурации (базе) все равно будет определены 4 в/к, так как это написано выше.

Для того, чтобы работать с большим кол-вом в/к — нужно:

  1. добавить нужное кол-во в/к в конфигурацию (ссылка в меню справа «добавить кaмepy»),
  2. определить значения по-умолчанию для всех в/к,
  3. настроить каждую кaмepy в отдельности.

Где находятся конфигурация с настройками: заходим браузером по адресу:

Имя пользователя install, пароль — пустой (по умолчанию после установки).

Ссылка в меню справа — « видeoкaмepы->параметры для всех »

Идея такая: если все или большая группа в/к должны работать с одними настройками, определяем значения параметров один раз для всех сразу. Ну и конечно же, для конкретной кaмepы можно переопределить значение каждого из параметров настроек.

Итак, рассмотрим параметры, которые наиболее вероятно могут быть одинаковыми для всех в/к в системе.

  • в зависимости от того, каких в/к больше определяем cam_type=
  • в этом разделе определяем параметры norm, deinterlacer, auto_brightness .
    • параметры pre_record, post_record и возможно motion_series_end ;
    • параметры file_fmt, mpeg_maxfilesize, mpeg_view_fps и др. параметры из соответствующих вложенных подразделов;
    • если большинство кaмep нужно смотреть в живую на локальном мониторе — monitor_live=Вкл ;
    • если большинство кaмep нужно смотреть в живую удаленно через браузеры — webcam_live=Вкл ;
  • Многие значения должны быть уникальные для каждой в/к.

    Подраздел «Параметры доступа к Motion JPEG сетевым IP-камерам и IP-видеосерверам(видеошлюзам)»
    • в этом разделе определяем параметры InetCam_URL, InetCam_HTTP_GET (. пример: InetCam_URL=http:// , InetCam_HTTP_GET=/axis-cgi/mjpg/video.cgi?resolution=640×480&colorlevel=100&req_fps=5, подробней здесь >>)
    • так как кaмepы «наблюдают» разные планы, то почти все настройки ПДД рекомендуется подстраивать для каждой в/к
    • параметр text_left — название кaмepы (ТОЛЬКО LATINSKIE, типа DOROGA, KPP1, CAMERA5)
    • параметр v4l_pipe (. назначаем последовательно, чтобы не было совпадений)
    • параметр wc_port (. назначаем последовательно 8081,8082,…, чтобы не было совпадений)
  • Локальный вьювер (просмотрщик) — это программа МОНИТОР. Её запуск — команда mon.

    МОНИТОР отображает на экране заранее определенные матрицы с изображениями в/к.

    • Типы матриц — одна кaмepa, квадраторы 2х2, 3×3, 4×4 и полиэкраны (различные).
    • Кол-во матриц — до 10.
    • Быстрое переключение между матрицами — клавишами клавиатуры 1.
    • Максимальное кол-во в/к в матрице (квадратор 4х4) — до 16.

    Все вышеописанное должно быть заранее определено в настройках администратором, иначе будет не доступно пользователю.

    Где настраивать — cсылка в меню справа « Монитор «. Далее можно удалить, добавить, править матрицы(конфигурации окон).

    Будут выбираться только те кaмepы, по которым monitor_live=Вкл и правильно определен уникальный параметр v4l_pipe .

    Источник

    Оцените статью