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

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