НАСТРОЙКА СЕРВЕРА ВИДЕОНАБЛЮДЕНИЯ

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

Видеоконференция в Linux

На статусной странице сервера кроме информации о состоянии сервера есть так же ссылки на все транслируемые потоки, так что можно сразу их протестировать.

Для картинки с камеры на 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>