Доброго времени суток, уважаемые.
Данный пост призван дать читающему пошаговое руководство «Как дать возможность двумстам сотрудникам узнать об очереди в столовой не вставая с рабочего места». Но обо всём по порядку.
Найти всю необходимую информацию, для решения задачи, в одном месте мне не удалось. Это и стало поводом к написанию данного руководства.
Исходные данные: Имеются две IP камеры в двух столовых. Есть корпоративный сайт.
Задача: Дать возможность сотрудникам узнавать об очередях в столовой.
Решение задачи
Структурная схема такова:
- FFserver получает поток с двух IP камер на сервер
- На корпоративном сайте размещаются ссылки на нужные файлы, формируемые 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 проверенные нами ранее.
# Порт, на котором будет работать 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`а нет возможности демонизации.
Скрипт автозапуска можно подсмотреть ниже.
#! /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
Автор: тащит всю команду