НАСТРОЙКА СЕРВЕРА ВИДЕОНАБЛЮДЕНИЯ
Если возникает задача организации трансляции видеопотока с веб-камеры в сеть, наиболее популярным инструментом для организации такой трансляции является VLC, однако с некоторых пор в составе проекта ffmpeg разрабатывается проект ffserver, позволяющий решать туже самую задачу и имеющий более удобный способ конфигурирования. Далее будет показан пример использования ffserver для организации трансляции с веб-камеры.
Уточним начальные условия:
- Сервер под управлением Ubuntu Server 9.10;
- Веб-камера Skypemate WC-103M, подключенная к серверу.
Задача: организовать трансляцию с камеры по http в формате flv с возможностью встраивания изображения с камеры в веб-страницы.
Одной из интересных особенностей ffserver является то, что он не транслирует поток сам, а ретранслирует поток с другого источника (примерно так же, как это делает icecast). В связи с этим обычно описывают конфигурации, в которых отдельно сначала запускает ffserver, а потом источник потока (чаще всего ffmpeg). Мы же будем использовать конфигурацию, в которой ffserver сам запускает источник потока.
Приступаем к решению. Для начала установим пакет ffmpeg (ffserver является его частью):
sudo apt-get install ffmpeg
Сразу после установки приступаем к конфигурированию. Для решения задачи достаточно привести файл "/etc/ffserver.conf" к следующему виду:
# Порт, на котором будет работать ffserver Port 12345 # Адрес, на котором будет работать ffserver. # Если указать 0.0.0.0 то будут использованы все доступные адреса BindAddress 0.0.0.0 # Максимальное количество обслуживаемых соединений MaxHTTPConnections 2000 # Максимальное количество клиентов MaxClients 1000 # Максимальная используемая полоса (в килобитах) MaxBandwidth 1000 # Файл журнала. Формат подобен формату лога apache CustomLog /var/log/ffserver-access.log # Описываем источник <Feed webcam.ffm> # Временный файл для хранения промежуточных данных File /tmp/webcam.ffm # Максимальный размер файла с промежуточными данными FileMaxSize 3M # Команда для запуска источника. # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 # С каких адресов может обращаться источник ACL allow 127.0.0.1 </Feed> # Описываем первый поток. Это будет поток в формате flv <Stream webcam.flv> # Источник потока Feed webcam.ffm # Используемый формат Format flv # Используемый кодек VideoCodec flv # Частота кадров VideoFrameRate 30 # Размер буфера VideoBufferSize 80000 # Битрейт VideoBitRate 200 # Минимальное и максимальное качество VideoQMin 1 VideoQMax 5 # Размер видео. Дожно совпадать с размером видео на источнике VideoSize 640x480 # Время ожидания перед началом отправки данных клиенту (в секундах) PreRoll 1 # Звук мы транслировать не будем NoAudio </Stream> # Второй поток. Это SWF-файл с FLV-потоком внутри # Всё остальное по аналогии <Stream webcam.swf> Feed webcam.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>
Более детальную информацию о настройке ffserver можно найти в официальной документации и примере конфигурационного файла от разработчиков продукта.
Запускаем ffserver командой:
ffserver -f /etc/ffserver.conf
Чтобы ffserver автоматически запускался при загрузке сервера нужно добавить эту команду в файл "/etc/rc.local".
После запуска ffserver можно открыть в браузере адрес "http://<адрес_вашего_сервера>:12345" и увидеть страницу статуса сервера:
На статусной странице сервера кроме информации о состоянии сервера есть так же ссылки на все транслируемые потоки, так что можно сразу их протестировать.
Для картинки с камеры на html-страничку нужно добавить на неё следующий код:
<embed src="http://<адрес_вашего_сервера>:12345/webcam.swf" width=640 height=480 />
От себя добавлю рабочий конфиг на 2 камеры:
# Порт, на котором будет работать ffserver
Port 8081
# Адрес, на котором будет работать ffserver.
# Если указать 0.0.0.0 то будут использованы все доступные адреса
BindAddress 0.0.0.0
# Максимальное количество обслуживаемых соединений
MaxHTTPConnections 2000
# Максимальное количество клиентов
MaxClients 1000
# Максимальная используемая полоса (в килобитах)
MaxBandwidth 2000
# Файл журнала. Формат подобен формату лога apache
CustomLog /var/log/ffserver-access.log
# Описываем источник
<Feed webcam1.ffm>
# Временный файл для хранения промежуточных данных
File /tmp/webcam1.ffm
# Максимальный размер файла с промежуточными данными
FileMaxSize 3M
# Команда для запуска источника.
# Адрес для отправки данных источником автоматически будет добавлен в конец этой строки
Launch ffmpeg -s 1280x720 -f video4linux2 -i /dev/video1
# С каких адресов может обращаться источник
ACL allow 127.0.0.1
</Feed>
<Feed webcam2.ffm>
File /tmp/webcam2.ffm
Launch ffmpeg -s 1280x720 -r 25 -i /dev/video0
FileMaxSize 20M
ACL allow 127.0.0.1
</Feed>
# Описываем первый поток. Это будет поток в формате flv
<Stream webcam1.flv>
# Источник потока
Feed webcam1.ffm
# Используемый формат
Format flv
# Используемый кодек
VideoCodec flv
# Частота кадров
VideoFrameRate 30
# Размер буфера
VideoBufferSize 80000
# Битрейт
VideoBitRate 200
# Минимальное и максимальное качество
VideoQMin 1
VideoQMax 5
# Размер видео. Дожно совпадать с размером видео на источнике
VideoSize 1280x720
# Время ожидания перед началом отправки данных клиенту (в секундах)
PreRoll 1
# Звук мы транслировать не будем
NoAudio
</Stream>
<Stream webcam2.flv>
# Источник потока
Feed webcam2.ffm
# Используемый формат
Format flv
# Используемый кодек
VideoCodec flv
# Частота кадров
VideoFrameRate 30
# Размер буфера
VideoBufferSize 80000
# Битрейт
VideoBitRate 200
# Минимальное и максимальное качество
VideoQMin 1
VideoQMax 5
# Размер видео. Дожно совпадать с размером видео на источнике
VideoSize 1280x720
# Время ожидания перед началом отправки данных клиенту (в секундах)
PreRoll 1
# Звук мы транслировать не будем
NoAudio
</Stream>
# При обращении к индексной страницы ffserver будем отображать текущий статус сервера
<Stream index.html>
Format status
</Stream>