Linux -- это интересно

Трансляция потока с веб-камеры с помощью ffserver


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

Иногда возникает задача организации трансляции видеопотока с веб-камеры в сеть. Наиболее популярным инструментом для организации такой трансляции является VLC, однако с некоторых пор в составе проекта ffmpeg разрабатывается проект ffserver, позволяющий решать туже самую задачу и имеющий более удобный способ конфигурирования. Далее будет показан пример использования ffserver для организации трансляции с веб-камеры.

Уточним начальные условия:

    • Сервер под управлением Ubuntu Server 9.10;

 

    • Веб-камера Skypemate WC-103M, подключенная к серверу.

Задача: организовать трансляцию с камеры по http в формате flv с возможностью встраивания изображения с камеры в веб-страницы.

Одной из интересных особенностей ffserver является то, что он не транслирует поток сам, а ретранслирует поток с другого источника (примерно так же, как это делает icecast). В связи с этим обычно описывают конфигурации, в которых отдельно сначала запускает ffserver, а потом источник потока (чаще всего ffmpeg). Мы же будем использовать конфигурацию, в которой ffserver сам запускает источник потока.

Приступаем к решению. Для начала установим пакет ffmpeg (ffserver является его частью):

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 />

На этом всё. Приятной работы!

Автор: MooSE


Смотрите также:

Скринкастинг в Linux (FFmpeg)

Трансляция потока с веб-камеры с помощью VLC

Комментариев: 42 RSS

Недавно надо было по работе. Переискал всё что можно. Нашёл только из вменяемого способ с VLC. И, так как никогда с этим не сталкивался, провозился весь день, пока понял что к чему и как там. А тут всё наглядно и понятно )) Всё Ъ :) как раз то, что нужно было!

Спасибо автору - MooSE! В понедельник будет чем заняться :)

Как реализовать нечто аналогичное на Виндусах (я имею в виду вещание с вебкасерычарез FFserver)?

Ну так найдите сборку FFmpeg под винду и пробуйте настроить. FFserver является частью FFmpeg.

Я вот нашёл:

http://ffmpeg.arrozcru.org/autobuilds/

А дальше надо пробовать качать, ставить, настраивать, гуглить дальше по возникающим вопросам.

Так же, не забываем про VLC, с помощью которого довольно просто можно реализовать потоковое вещание с вебкамеры по сети.

Не подскажите где можно добыть информации о том как через ВЛЦ устраивать вещание (хоть в каком-нибудь формате)?

вот, в двух словах со скринами:

http://zenway.ru/page/vlc-to-lan

Александр6 2010-09-17 в 08:58:36

Как сделать то же самое но со звуком?

смотря что нужно.

Скажем, у меня есть вебкамера со встроенным микрофоном. Я её подключил и немного подправил конфиги (убив пол дня на то, чтобы понять, что править:).

Так вто. Немного подправил строку с Launch:

Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 -f alsa -i hw:1

номер hw можно эксперементально подобрать. Можно файл указать или другое устройство.

И ещё я убрал (закомментировал) первое NoAudio. В итоге я получил видео со звуком :)

Смотрите документацию, там всё рвсписано в примерах, как указывать качество звуковой дорожки, как выбирать кодек...

Для тестов можно использовать что-то вроде:

ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1 raw.avi

и эксперементировать с ним, пока не получите нужную картинку. Потом вносим изменения в Launch.

Ещё столкнулся с такой проблемой при получении изображения с камеры:

[video4linux2 @ 0x99222c0][3]Capabilities: 5000001
[video4linux2 @ 0x99222c0]Cannot find a proper format.
/dev/video0: I/O error occurred
Usually that means that input file is truncated and/or corrupted.

Решается просто. Добавляется вот это вначале:

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so

Например:

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1 raw.avi
Александр8 2010-09-17 в 13:25:02

Я так и понял, что надо строку с Launch поправить, но как я не правил конфиг ничего не выходило. А вот как определить номер устройства захвата звука я нашел, нужно ввести команду:

$ arecord -l

И будет результат:

**** List of CAPTURE Hardware Devices ****
card 0: Intel [HDA Intel], device 0: ALC888 Analog [ALC888 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 2: ALC888 Analog [ALC888 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: U0x46d0x8da [USB Device 0x46d:0x8da], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

То есть, веб-камеры микрофон под номером 1

Александр9 2010-09-17 в 15:06:34

vovans - спасибо за подсказки, звук появился, но как быть с синхронизацией звука и видео? Возможно ли это, я попробовал менять некоторые параметры - ничего не помогло.

Ой, не знаю... сейчас времени нет тестировать... Да и на работе это странно выглядит )) подобное тестирование :)

Посмотрите тут:

http://www.ffmpeg.org/ffmpeg-doc.html

на предмет sync. Есть async и т.п. А ещё стоит поискать на предмет ffmpeg и синхронизации аудио и видео. Возможно, в поисковом запросе стоит указать, что действия производятся с флешем. Возможно сам кодек специфичен...

Найдёте решение, пишите!

Алексей11 2010-09-24 в 13:17:29

Сделал всё так, как Вы написали + подправил launch. Но работать не хочет. В браузере по ссылке на файло с видео открывается чёрный экран, а при попытке запустить из командной строки получается вот что:

karopka@karopka-desktop:~$ LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so ffmpeg -s 640x480 -f video4linux2 -i /dev/video0
FFmpeg version SVN-r0.5.1-4:0.5.1-1ubuntu1, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --extra-version=4:0.5.1-1ubuntu1 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 1 / 52.20. 1
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Mar  4 2010 12:35:30, gcc: 4.4.3
[video4linux2 @ 0x94e72c0][3]Capabilities: 5000001
[video4linux2 @ 0x94e72c0]The V4L2 driver changed the video from 640x480 to 320x240
Input #0, video4linux2, from '/dev/video0':
  Duration: N/A, start: 1285319364.500202, bitrate: -2147483 kb/s
    Stream #0.0: Video: rawvideo, yuv420p, 320x240, -2147483 kb/s, 1000k tbr, 1000k tbn, 1000k tbc
At least one output file must be specified
ioctl(VIDIOC_QBUF)
karopka@karopka-desktop

У меня на вебморде в разделе connection status присутствует только один файл index.html... Что я не так сделал?

а в Launch всё правильно прописано?

Оно работает само по себе, без конфига? Ну, то, что написано в Launch

Аноним13 2010-09-27 в 09:28:24
Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0

вот так прописано.

Алексей14 2010-10-22 в 11:50:49

Работает, я забыл в iptables правило прописать. Отличная статья.

Алексей15 2010-10-22 в 15:14:10

Видео работает, но со звуком работать отказывается наотрез.

root@karopka-desktop:/home/karopka# lsusb
Bus 001 Device 003: ID 046d:09a4 Logitech, Inc. QuickCam E 3500
root@karopka-desktop:/home/karopka# arecord -l
**** Список CAPTURE устройств ****
карта 1: U0x46d0x9a4 [USB Device 0x46d:0x9a4], устройство 0: USB Audio [USB Audio]
  Подустройства: 1/1
  Подустройство №0: subdevice #0

То есть web-камера у меня с микрофоном. Но если я в конфиге закомментирую строчку NoAudio, то видео не показывает. А если её открыть, то видео есть. Не помогает и изменение строки launch на

ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1

Хотя если использовать файл для отладки, то в файл записывается и видео и звук:

ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1 raw.avi

Что не так я делаю, есть идеи?

а комментарий #7 перечитывали?

У меня было нечто подобное. И я закомментировал лишь одну NoAudio.

А вторую оставил как есть. И заработало. Давно это было :)

Кстати, у меня тоже камера с микрофоном и всё работало.

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

помогите граждане

при переходе по webcam.flv открывается новая страница с сохранение файла flv размером 187 байт.

при переходе по webcam.swf просто открывается пустая страница, но ничего не показывает, хотя по правой кнопке открывается панелька управления плеером.

в тестовый поток пишется нормально. подскажите чего поправить?

Попробуйте с опциями поиграть.

Выше, в комментариях, я писал, что пробовал менять.

Должно всё работать.

Всё нормально запускается. Возникла обратная проблема - как остановить сервер.

У меня не работает вот эта строчка:

Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0

выполнение данной команды выбрасывает вот такую ошибку:

At least one output file must be specified

Что является следствием не верно заданных опций, в man для ffmpeg сказано:

ffmpeg -i InputFile OutputFile

а в вашей команде после флага -i идет только InputFile, а OutputFile файла нет. Вот сижу и не пойму как она у вас могла работать ?

Всё нормально запускается. Возникла обратная проблема - как остановить сервер.

iriz: Вот вам ответ на всякий случай

ps -ef | grep ffserver 
booch    10642     1  0 23:05 ?        00:00:00 ffserver -f /etc/ffserver.conf
kill -9 10642

нет, проще всё же не так, а вот так:

killall -9 ffserver

Всегда помните про killall ;) с ним проще

Александр24 2011-02-08 в 16:13:41

Может кто подскажет, какие параметры задать в Launch ffmpeg..... , чтобы захватывать изображение с рабочего стола, а не с веб-камеры.

Эта команда выполнит захват видео с раб стола:

ffmpeg -f x11grab -s cif -r 25 -i :0.0 out.mpg

Вот ещё для примера:

ffmpeg -f x11grab -i :0.0 -s 1280x800 -r 25 -vcodec qtrle screencast.mov

То есть, по аналогии.

Так же посмотрите:

http://zenway.ru/page/screencasting-linux-ffmpeg

Александр26 2011-02-09 в 04:42:52

Захват по Вашему примеру работает для вывода в файл. А как это прописать в конфиге ffserver, чтобы также транслировать изображение в сеть, как с веб-камеры? Задача стоит следующая: необходимо транслировать на сайт мероприятие, это реализовано как описано Вами выше; также необходимо транслировать презентации, которые будут выводиться через проектор на экран. Идея - запустить два потока на разных портах, на странице будет два окошка - одно выводит зал и лектора со звуком, второе только изображение с рабочего стола компьютера.

Команда запуска ffm

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 http://127.0.0.1:12345/webcam.ffm

Опытным путём подтвердилось, что Launch внутри config'a гораздо капризнее, чем отдельный запуск ffmpeg с записью в файл, читаемый ffserver-ом. Поэтому лучше просто закомментировать строчку с Launch, запустить сервер, затем запустить

ffmpeg [источники и их опции, как описано выше] http://localhost:8080/webcam.ffm

При вещании файла разрешение не обязательно указывать, у меня последняя версия программ без проблем как сжимала, так и растягивала картинку. То же самое с форматом, он вроде без проблем определяется автоматически.

Андрей30 2011-08-22 в 13:08:15

Хотел спросить у знающих людей. Умеет ли ffmpeg подключать libavfilter при трансляции видео на ffserver? В частности надо наложить оврелеем картинку.

Сейчас я транслирую RTSP-поток с IP-камеры

ffmpeg -i rtsp://192.168.0.1:554/h264 http://localhost:8090/feed1.ffm

Всё работает нормально

Если направить поток с оверлеем в файл

ffmpeg -i rtsp://192.168.0.1:554/h264_2 -vf "movie=logo.png [logo]; [in][logo] overlay=10:main_h-overlay_h-10 [out]" out.mp4

То тоже всё работает нормально.

Но если направить поток с оверлеем в ffserver

ffmpeg -i rtsp://192.168.0.1:554/h264_2 -vf "movie=logo.png [logo]; [in][logo] overlay=10:main_h-overlay_h-10 [out]" http://localhost:8090/feed1.ffm

то картинки просто нет. С этим что-то можно сделать? Или в ffserver просто нет такого функционала?

ffmpeg -f alsa -i pulse -f video4linux2 -s 640x480 -qscale 1 -r 25 -i /dev/video0 -vcodec mjpeg out.avi

я пробовал писать с камеры в файл вместе со звуком вроде сносно, надеюсь чем нибудь вам ето поможет)))

Владимир32 2011-10-28 в 09:47:49

Добрый день!

Столкнулся с проблемой рассинхронизации видео и аудио потоков при захвате с ТВ-тюнера.

Исходные данные:

1. ТВ-тюнер, данные lspci:

03:0d.0 Multimedia controller: Philips Semiconductors SAA7134/SAA7135HL Video Broadcast Decoder (rev 01)

2. Дистрибутив: Debian Squeeze 2.6.32-5-686 (ядро стоковое)

3. ffmpeg 0.6.1+svn20101128-0.2squeeze2

4. v4l-utils 0.8.0-1

5. библиотеки:

- libavutil 50.33.0

- libavcore 0.14.0

- libavcodec 52.97.2

- libavformat 52.87.1

- libavdevice 52.2.2

- libavfilter 1.65.0

- libswscale 0.12.0

- libpostproc 51.2.0

6. Настраиваем тюнер на канал (0 - Television, 127.25 - "ТНТ", 4 - PAL, /dev/video0 - ТВ-тюнер):

v4l2-ctl --set-input=0 --set-freq=127.25 --set-standard=4 --device=/dev/video0

7. Записываем файл.

ffmpeg -f video4linux2 -deinterlace -s 384x288 -i /dev/video0 -f alsa -i hw:1,0 -f matroska -acodec mp2 -vcodec mpeg1video -b 800k -y -t30 tv_mpeg.mkv

Если добавить параметр "-r 25" выходит ошибка:

[video4linux2 @ 0x9abdca0] ioctl set time per frame(1/25) failed

/dev/video0: Input/output error

Леонид33 2011-12-10 в 23:50:03

У меня есть 5 GSM модемов, хочу объеденить каналы по ману отсюда _h_t_t_p://help.ubuntu.ru/wiki/ip_balancing

Подскажите, получу ли я прирост скорости при вещании видео потока указанным методом(идет ли вещание сплошным потоком или разбивается на фрагменты)?

Здравствуйте! Столкнулся с проблемой в связке ffserver и Ubuntu server 11.10. При попытке запустить сервер вываливается с ошибкой bind (port 8090): Address family not supported by protocol. Никто не сталкивался?

Господа, много чего перепробовал уже с конфигурацией настройки потокового вещания, но никак звук на swf не появляется. В файл пишет все хорошо (ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1 raw.avi), а вот нет звука по ссылке на swf файл. В ссылке поменял расширение файла на flv () - звук есть, возвращаю назад, изображение есть - звука нет. Если раскомменитировать второе NoAudio выдает ошибки, если вписывает в ffserver еще и кодек для swf (AudioCodec adpcm_swf) - то ошибки уходят, но теперь видео не работает ни на flv ни на swf, ничего вобщем на работает. приходится закомментировать только NoAudio для flv а для swf оставлять... Но нужен звук для swf. Что тут поделать ума не приложу. Спасибо заранее умные люди!

Yurian | 2012-04-09 в 01:42:23

Я у себя в ffserver.conf оставил только flv и этот поток показываю через jwplayer.

<Stream iptv.flv>
Feed iptv.ffm
Format flv
VideoCodec flv
VideoFrameRate 25
VideoBufferSize 80000
VideoBitRate 200
VideoQMin 1
VideoQMax 1
VideoSize 320x240
AudioBitRate 128
AudioSampleRate 44100
AudioChannels 2
PreRoll 1
</Stream>

Может кто подскажет что прописать в , чтобы повысить громкость звука для flv потока.

У ffmpeg есть опция -vol, у которой по уомолчанию значение 256:

$ ffmpeg --help | grep vol
-vol volume         change audio volume (256=normal)

Так что, можно попробовать поиграть с ней. Вот таблица:

dB   -vol
-----------
-9   32
-6   64
-3   128
0    256
+3   512
+6   1024
+9   2048

Я так понимаю, что можно крутить и выше 2048 :) пока не добьётесь нужного результата ))

Алексей40 2013-12-10 в 09:10:06

Всем привет. Такая проблемма, видео запускается, даже работает какое-то время (10 - 15 секунд) но после зависает, при обнавлении страницы, оно опять поработает несколько секунд и встает. В чем может быть беда?

Port 12345
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog C
<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>
<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>
<Stream index.html>
    Format status
</Stream>

Ошибок сервер не выдает. Сделал все, как в примере.

скажите пожалуйста а на window xp это можно устроить если можно обьясните пожалуйста заранее спасибо

Александр42 2016-10-10 в 11:50:24

Хм.. а как добавить одну, две, три... камеры для трансляции.. Через ffserver это возможно вообще? Имею ввиду, клиент решил транслировать себя с вебки в сеть. Как транслировать все желаемые подключенные вебки на сервер, чтобы он потом выдвал поток в swf, дабы мы все их видели? Полюбому через сервер делать надо, дабы не нагружать зрителями канал вещающего.

Кто наведет на мысль?

Оставьте комментарий!
Используйте нормальные имена.Войти через loginza
Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



 
(обязательно)