Трансляция потокового видео на сайт с двух IP камер

в 19:30, , рубрики: Настройка Linux

Доброго времени суток, уважаемые.

Данный пост призван дать читающему пошаговое руководство «Как дать возможность двумстам сотрудникам узнать об очереди в столовой не вставая с рабочего места». Но обо всём по порядку.

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

Исходные данные: Имеются две IP камеры в двух столовых. Есть корпоративный сайт.
Задача: Дать возможность сотрудникам узнавать об очередях в столовой.

Решение задачи

Структурная схема такова:

  1. FFserver получает поток с двух IP камер на сервер
  2. На корпоративном сайте размещаются ссылки на нужные файлы, формируемые FFserver

Данное решение позволяет снять нагрузку с камер и переложить её на ресурсы сервера.

О том, как установить и первично настроить FFserver хорошо написано Здесь и Здесь, за одним НО. Данные материалы описывают настройку при подключении Web-камеры непосредственно к ПК. Они стали для меня отправной точкой поисков.

RTSP

Потоковое видео будем забирать по протоколу RTSP. Информацию о нём можно найти в интернете. Главное знать, настроен ли он на камере. Как настроить написано в инструкции к Вашей IP камере.

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

ffmpeg -rtsp_transport tcp -i rtsp://login:password@IP/Streaming/Channels/1 -c copy -map 0:0 video.mp4

Где:

  • login:password — логин и пароль к камере с правами захвата видеопотока (admin подойдёт по умолчанию)
  • IP — ip-адрес Вашей камеры
  • /Streaming/Channels/1 — путь до rtsp потока (узнаётся или из инструкции к камере или из интернета по запросу «rtsp url марка и модель камеры»)
  • video.mp4 — файл с видео (если он создался и там есть запись, то поток по RTSP забирается нормально и настройки правильные)

FFserver

Ниже приводится конфигурационный файл /etc/ffserver.conf для двух IP камер

Обратите внимание, что используются rtsp url проверенные нами ранее.

/etc/ffserver.conf


# Порт, на котором будет работать ffserver
Port 8090
# Адрес, на котором будет работать ffserver.
# Если указать 0.0.0.0 то будут использованы все доступные адреса
BindAddress 192.168.1.15
# Максимальное количество обслуживаемых соединений
MaxHTTPConnections 2000
# Максимальное количество клиентов
MaxClients 1000
# Максимальная используемая полоса (в килобитах)
MaxBandwidth 5000
# Файл журнала. Формат подобен формату лога apache
CustomLog /var/log/ffserver-access.log
# Описываем источник
<Feed cam1.ffm>
    # Временный файл для хранения промежуточных данных
    File /video/cam1.ffm
    # Максимальный размер файла с промежуточными данными
    FileMaxSize 3M
    # Команда для запуска источника.
    # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки
    Launch ffmpeg -rtsp_transport tcp -i rtsp://admin:password@192.168.1.30/Streaming/Channels/1
    # С каких адресов может обращаться источник
  #  ACL allow 127.0.0.1
</Feed>
# Описываем первый поток. Это будет поток в формате flv
<Stream cam1.flv>
    # Источник потока
    Feed cam1.ffm
    # Используемый формат
    Format flv
    # Используемый кодек
    VideoCodec flv
    # Частота кадров
    VideoFrameRate 30
    # Размер буфера
    VideoBufferSize 80000
    # Битрейт
    VideoBitRate 200
    # Минимальное и максимальное качество
    VideoQMin 1
    VideoQMax 5
    # Размер видео. Дожно совпадать с размером видео на источнике
    VideoSize 640x480
    # Время ожидания перед началом отправки данных клиенту (в секундах)
    PreRoll 1
    # Звук мы транслировать не будем
    NoAudio
</Stream>
# Второй поток. Это SWF-файл с FLV-потоком внутри
# Всё остальное по аналогии
<Stream cam1.swf>
    Feed cam1.ffm
    Format swf
    VideoCodec flv
    VideoFrameRate 30
    VideoBufferSize 80000
    VideoBitRate 200
    VideoQMin 1
    VideoQMax 5
    VideoSize 640x480
    PreRoll 1
    NoAudio
</Stream>
#-------------------------------------------------------------------------------------------------------------
<Feed cam2.ffm>
    # Временный файл для хранения промежуточных данных
    File /video/cam2.ffm
    # Максимальный размер файла с промежуточными данными
    FileMaxSize 3M
    # Команда для запуска источника.
    # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки
 Launch ffmpeg -rtsp_transport tcp -i rtsp://admin:password@192.168.1.29/Streaming/Channels/1
    # С каких адресов может обращаться источник
#    ACL allow 127.0.0.1
</Feed>
# Описываем первый поток. Это будет поток в формате flv
<Stream cam2.flv>
    # Источник потока
    Feed cam2.ffm
    # Используемый формат
    Format flv
    # Используемый кодек
    VideoCodec flv
    # Частота кадров
    VideoFrameRate 30
    # Размер буфера
    VideoBufferSize 80000
    # Битрейт
    VideoBitRate 200
    # Минимальное и максимальное качество
    VideoQMin 1
    VideoQMax 5
    # Размер видео. Дожно совпадать с размером видео на источнике
    VideoSize 640x480
    # Время ожидания перед началом отправки данных клиенту (в секундах)
    PreRoll 1
    # Звук мы транслировать не будем
    NoAudio
</Stream>
# Второй поток. Это SWF-файл с FLV-потоком внутри
# Всё остальное по аналогии
<Stream cam2.swf>
    Feed cam2.ffm
    Format swf
    VideoCodec flv
    VideoFrameRate 30
    VideoBufferSize 80000
    VideoBitRate 200
    VideoQMin 1
    VideoQMax 5
    VideoSize 640x480
    PreRoll 1
    NoAudio
</Stream>
# При обращении к индексной страницы ffserver будем отображать текущий статус сервера
<Stream index.html>
    Format status
</Stream>

Для того, чтобы отдача потока не грузила диск, разместим временные файлы в оперативной памяти.

Создадим директорию video в корне:

sudo mkdir /video

В конец /etc/fstab необходимо давить следующее:

tmpfs /video tmpfs noatime,nodiratime,nodev,nosuid,uid=1000,gid=100,mode=0700,size=100M 0 0

И выполнить:

sudo mount -a

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

Запуск FFserver выполняется командой:

ffserver -f /etc/ffserver.conf

P.S. В текущей версии FFserver`а нет возможности демонизации.

Скрипт автозапуска можно подсмотреть ниже.

/etc/init.d/ffserver

#! /bin/sh
### BEGIN INIT INFO
# Provides:          ffserver
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:	     0 1 6
# Short-Description: Start ffserver daemon
### END INIT INFO

set -e

NAME=ffserver
DAEMON=/usr/local/bin/$NAME
DESC="ffserver"

test -x $DAEMON || exit 0

DIR=/var/run
PID=$DIR/$NAME.pid
RETRY=15
LOG=/var/log/ffserver.log
if test ! -d "$DIR"; then
  mkdir "$DIR"
  chown -R root:root "$DIR"
fi

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

# define LSB log_* functions.
. /lib/lsb/init-functions

case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
	start-stop-daemon --oknodo --start --pidfile $PID 
	  --exec $DAEMON >$LOG 2>&1 &
    case "$?" in
        0) log_end_msg 0 ;;
        *) log_end_msg 1; exit 1 ;;
    esac
	;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
	start-stop-daemon --oknodo --stop --exec $DAEMON --retry $RETRY
    case "$?" in
        0) log_end_msg 0 ;;
        *) log_end_msg 1; exit 1 ;;
    esac
	;;
  status)
   ls -l /proc/`cat $PID`/exe > /dev/null 2>&1
   if [ $? -eq 0 ]; then
       echo "$DESC is running"
       exit 0
   else
       echo "$DESC is NOT running"
       exit 1
   fi
   ;;
  restart|force-reload)
	$0 stop
	$0 start
	;;
  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
	exit 1
	;;
esac

exit 0

Добавляем в автозагрузку так:

update-rc.d ffserver defaults

Автор: тащит всю команду

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js