Pull to refresh

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

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

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

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

Исходные данные: Имеются две 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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.