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

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

Рубрика: Администрирование -> Аудио и видео ПО
Метки: | | | | |
Суббота, 3 апреля 2010 г.
Просмотров: 16719
Подписаться на комментарии по RSS
Видеоконференция в 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

Автор: vovans, xmpp: xmpp
Добавить страницу в закладки:
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us
Комментариев: 36
  1. Недавно надо было по работе. Переискал всё что можно. Нашёл только из вменяемого способ с VLC. И, так как никогда с этим не сталкивался, провозился весь день, пока понял что к чему и как там. А тут всё наглядно и понятно )) Всё Ъ :) как раз то, что нужно было!

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

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

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

    Я вот нашёл:

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

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

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

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

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

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

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

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

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

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

    Так вто. Немного подправил строку с 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 - спасибо за подсказки, звук появился, но как быть с синхронизацией звука и видео? Возможно ли это, я попробовал менять некоторые параметры - ничего не помогло.

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

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

    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... Что я не так сделал?

  12. а в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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 файла нет. Вот сижу и не пойму как она у вас могла работать ?

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

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

    ps -ef | grep ffserver 
    booch    10642     1  0 23:05 ?        00:00:00 ffserver -f /etc/ffserver.conf
    kill -9 10642
  23. нет, проще всё же не так, а вот так:

    killall -9 ffserver

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

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

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

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

    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, чтобы также транслировать изображение в сеть, как с веб-камеры? Задача стоит следующая: необходимо транслировать на сайт мероприятие, это реализовано как описано Вами выше; также необходимо транслировать презентации, которые будут выводиться через проектор на экран. Идея - запустить два потока на разных портах, на странице будет два окошка - одно выводит зал и лектора со звуком, второе только изображение с рабочего стола компьютера.

  27. 2011-02-28 в 09:15:23 | Виктор

    А как его под виндой запрустить ?

  28. Команда запуска 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
  29. Опытным путём подтвердилось, что 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 просто нет такого функционала?

  31. 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

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

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

  35. Спасибо!

  36. Господа, много чего перепробовал уже с конфигурацией настройки потокового вещания, но никак звук на 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. Что тут поделать ума не приложу. Спасибо заранее умные люди!

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




Войти через loginza

 
captcha