Linux с нескольких камер

Просмотр видео с нескольких IP-камер сразу

В общем, нужна софтина для просмотра видео сразу с нескольких IP-камер на одном экране.
Желательны:
1) реконнект при пропаже соединения с камерой,
2) кроссплатформенность,
3) бесплатность.

Может, какой-нибудь VLC умеет в multiwindow playing? Как настроить тогда?

Ещё короче: ищу бесплатный аналог MacroScop

Тайловый wm+mplayer+скрипт на sh который запускает несколько копий mplayer, по одной на каждую камеру.

А вообще zoneminder, но оно web и требует отдельный сервер. и еще хранит видео в виде кучи jpg файлов, которые необходимо самому собирать через ffmpeg/mencoder, хотя может за 2 года что-то изменилось.

Все правильно vlc это умеет, вот тут примерная реализация Система видеомониторинга. (комментарий) Вот тут можно почитать https://wiki.videolan.org/Mosaic/

А как тогда переподключение раз в десять секунд при потере потока сделать?

mpv самостоятельно реконнектится, я с него сериалы смотрю. Есть ещё ключик —loop=inf, на случай если поток оборвётся.

mpv в мозаику не умеет, похоже

Имхо, этим должен заниматься оконный менеджер.

Можно как-то так:

mplayer tv:// -vo xv -tv driver=v4l:width=640:height=480:device=/dev/video9 -geometry 320×240+0+0 -noborder

при использовании vloopback, выведет картинку 320×240 в верхнем левом углу без оконного бордюра. Совершенно понятно, что следующую картинку следует показать, изменив лишь x-координату -geometry.

Набросай себе табличную веб-страницу с флеш-плеером видеопотоков.

Ух. А флеш умеет в RTSP?

Первая ссылка в гугле выдала такое:

самое простое было бы встроить VLC, он жрёт вообще всё. Но Хром собрался выключить плагины, непонятно что с этим делать.

это точно можно сделать средствами gstreamer, как именно — читай документацию, запускаешь из консоли gst-launcher и передаёшь в качестве параметра описание конвейера со всеми входящими потоками

Сегодня ночью выяснил что VLC не ресайзит потоки, поэтому нихрена не отображается. Попробую ещё с mpv и на худой конец с флешем.

Это еще очень сырой плеер.

Как настроить VLC для просмотра видео потока с нескольких ip камер одновременно

Подскажите как настроить просмотр видео потока через vlc с помощью mosaic с нескольких ip камер одновременно. На роутере к которому подключены ip камеры, имеется статич. ip. Не получается настроить просмотр видео с камер. ОС ubuntu 16.04. С Уважением.

Источник

Использование нескольких веб-камер USB в Linux

Запуск более одной веб-камеры USB в Debian/Linux приводит к следующей ошибке:

То, что изначально казалось проблемой программирования в OpenCV, превратилось в поиск загадочной проблемы с аппаратным и программным обеспечением после того, как те же ошибки возникли при запуске cheese и xawtv.

Очевидно, это вызвано тем, что веб-камеры запрашивают всю доступную полосу пропускания на хост-контроллере USB. Имея это в виду, я решил запустить wireshark и capinfos, чтобы увидеть, какую пропускную способность использует одна камера.

Интересно! Это может объяснить, почему две камеры с разрешением 320×240 работают, но любое более высокое разрешение не работает. Как будто мой контроллер USB работает только на скоростях USB 1, но lsusb показывает обе веб-камеры, принадлежащие устройству, которое предположительно поддерживает 480 мегабит в секунду.

В одном решении предлагалось заставить веб-камеры рассчитывать использование полосы пропускания вместо того, чтобы запрашивать их максимум, выполнив следующие команды:

К сожалению, это не имело никакого значения, поэтому я решил попробовать другое решение. В сообщении о StackOverflow предлагалось указать моим веб-камерам использовать более низкий FPS или сжатый видеоформат, такой как MJPEG, но после запуска списка v4lctl ни одна из моих веб-камер не поддерживает изменение их видео-режима.

И вот где я застрял. Почему две веб-камеры, работающие значительно ниже максимальной скорости USB 2, могут вызвать такую ошибку?

Читайте также:  Rock you kali linux

ps: это не проблема дискового пространства, df не отображает изменений при запуске веб-камер.

pps: если это имеет значение, вот вывод команды lsusb

Источник

Работа с usb видеокамерой в Linux. Часть 1

По популярности видеокамера, сегодня, стоит в одном ряду с микрофоном и наушниками. Она используется в различных направлениях, таких как распознавание объектов, дополненная реальность, видеоконференции и множество других. Но что же скрыто под капотом этих сложнейших программ? Как мы получаем картинку с видеокамеры? Этот цикл статей позволит взглянуть на простоту работы с видеокамерой на низком уровне, обработку полученного изображения.

Для начала, немного информации о работе с устройствами в системе Linux. Устройства в nix системах представляют собой файл. С некоторыми файлами-устройств мы можем работать как с обычными файлами. Например:

эта команда выведет на экран весь диск sda.

Есть устройства с которыми нельзя работать напрямую, к ним относится видеокамера.При попытке это сделать мы получим такую реакцию системы:

*Где /dev/video0 это файл-устройство найшей видеокамеры.

Для работы с ней нам понадобится системная функция ioctl детальнее о ней можно ознакомится [1]. Попробуем это применить. Вот код позволяющий считать информации с устройства (альтернатива команде cat для видеоустройств):

В первых строках кода считываются параметры с которой запущено приложение. Если параметров нету то device_name принимает стандартоне значение «/dev/video0».

В блоке «Open Device» происходит открытие устройства системной функцией open (нужно подключить header fcntl.h). Обязательный параметр O_RDWR отвечает за открытие устройства считывания/записи. Если при подключении возникла ошибка, то функция open вернет -1.

Блок «Read Params From Device» — это сердце нашей маленькой программы. Для его использования надо подключить билиотеку возможно прийдется её установить, у каждого дистрибутива свой пакет под эту библиотеку
Системная функция ioctl имеет три параметра:
file_device — дескриптор нашего устройства
VIDIOC_QUERYCAP — функция ядра, которую применяем для нашего устройства.
device_params — область памяти куда будет сброшен результат функции «VIDIOC_QUERYCAP».

device_params это структура состоящая из таких полей:

если возникла ошибка ioctl вернет -1

Блок «Close Device» закрывает дескриптор устройства.

Посмотрим программу в действии.

устройство не определилось ядром либо не подключено уборщица опять ненужные провода дергала.
Подключаем и заново запуск. Получаем такую информацию:

поле capabilities и device capabilities можно расшифровать благодаря константам из файла videodev2.h:

На этом вводная статья заканчивается. В следующих обзорах будут затронуты, такие темы как memory-mapping, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.

Источник

Большой брат в 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
и так далее.

Читайте также:  Кали линукс для работы

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

Теперь вернемся к скриптам, которые отрабатывают при начале и окончании
события.
Так как нам надо писать видео с камеры, то для этого я использовал 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 — Задержка в мс, которая должна вноситься в каждый канал

Читайте также:  Windows logged in user java

Если у вас проблемы с синхронизацией видео и звукового ряда, тогда надо менять
значения для последних двух параметров — 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. Объединяет все файлы за день в один.

Рассмотрим скрипт для чистки. У меня он располагается в директории /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: будьте внимательны с скриптом на питоне, так как сбилась вся
табуляция, что для него очень критично.

Источник

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