Трансляция потока с веб-камеры с помощью ffserver
Рубрика: Администрирование -> Аудио и видео ПОМетки: console | FFmpeg | администрирование | видео конвертер | видеонаблюдение | сеть
Суббота, 3 апреля 2010 г.
Просмотров: 16719
Подписаться на комментарии по RSS
Иногда возникает задача организации трансляции видеопотока с веб-камеры в сеть. Наиболее популярным инструментом для организации такой трансляции является 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" и увидеть страницу статуса сервера:

На статусной странице сервера кроме информации о состоянии сервера есть так же ссылки на все транслируемые потоки, так что можно сразу их протестировать.
Для картинки с камеры на html-страничку нужно добавить на неё следующий код:
<embed src="http://<адрес_вашего_сервера>:12345/webcam.swf" width=640 height=480 />
На этом всё. Приятной работы!
Автор: MooSE
Смотрите также:
Скринкастинг в Linux (FFmpeg)
Трансляция потока с веб-камеры с помощью VLC















Недавно надо было по работе. Переискал всё что можно. Нашёл только из вменяемого способ с VLC. И, так как никогда с этим не сталкивался, провозился весь день, пока понял что к чему и как там. А тут всё наглядно и понятно )) Всё Ъ :) как раз то, что нужно было!
Спасибо автору - MooSE! В понедельник будет чем заняться :)
Как реализовать нечто аналогичное на Виндусах (я имею в виду вещание с вебкасерычарез FFserver)?
Ну так найдите сборку FFmpeg под винду и пробуйте настроить. FFserver является частью FFmpeg.
Я вот нашёл:
http://ffmpeg.arrozcru.org/autobuilds/
А дальше надо пробовать качать, ставить, настраивать, гуглить дальше по возникающим вопросам.
Так же, не забываем про VLC, с помощью которого довольно просто можно реализовать потоковое вещание с вебкамеры по сети.
Не подскажите где можно добыть информации о том как через ВЛЦ устраивать вещание (хоть в каком-нибудь формате)?
вот, в двух словах со скринами:
http://zenway.ru/page/vlc-to-lan
Как сделать то же самое но со звуком?
смотря что нужно.
Скажем, у меня есть вебкамера со встроенным микрофоном. Я её подключил и немного подправил конфиги (убив пол дня на то, чтобы понять, что править:).
Так вто. Немного подправил строку с Launch:
номер hw можно эксперементально подобрать. Можно файл указать или другое устройство.
И ещё я убрал (закомментировал) первое NoAudio. В итоге я получил видео со звуком :)
Смотрите документацию, там всё рвсписано в примерах, как указывать качество звуковой дорожки, как выбирать кодек...
Для тестов можно использовать что-то вроде:
и эксперементировать с ним, пока не получите нужную картинку. Потом вносим изменения в Launch.
Ещё столкнулся с такой проблемой при получении изображения с камеры:
Решается просто. Добавляется вот это вначале:
Например:
Я так и понял, что надо строку с Launch поправить, но как я не правил конфиг ничего не выходило. А вот как определить номер устройства захвата звука я нашел, нужно ввести команду:
И будет результат:
То есть, веб-камеры микрофон под номером 1
vovans - спасибо за подсказки, звук появился, но как быть с синхронизацией звука и видео? Возможно ли это, я попробовал менять некоторые параметры - ничего не помогло.
Ой, не знаю... сейчас времени нет тестировать... Да и на работе это странно выглядит )) подобное тестирование :)
Посмотрите тут:
http://www.ffmpeg.org/ffmpeg-doc.html
на предмет sync. Есть async и т.п. А ещё стоит поискать на предмет ffmpeg и синхронизации аудио и видео. Возможно, в поисковом запросе стоит указать, что действия производятся с флешем. Возможно сам кодек специфичен...
Найдёте решение, пишите!
Сделал всё так, как Вы написали + подправил 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
вот так прописано.
Работает, я забыл в iptables правило прописать. Отличная статья.
Видео работает, но со звуком работать отказывается наотрез.
То есть web-камера у меня с микрофоном. Но если я в конфиге закомментирую строчку NoAudio, то видео не показывает. А если её открыть, то видео есть. Не помогает и изменение строки launch на
Хотя если использовать файл для отладки, то в файл записывается и видео и звук:
Что не так я делаю, есть идеи?
а комментарий #7 перечитывали?
У меня было нечто подобное. И я закомментировал лишь одну NoAudio.
А вторую оставил как есть. И заработало. Давно это было :)
Кстати, у меня тоже камера с микрофоном и всё работало.
Эхх, почему я не наткнулся на эту статью месяц назад ? пришлось ворочить монстрообразный red5 для целей проведения видеоконференции аля трансляции.
помогите граждане
при переходе по webcam.flv открывается новая страница с сохранение файла flv размером 187 байт.
при переходе по webcam.swf просто открывается пустая страница, но ничего не показывает, хотя по правой кнопке открывается панелька управления плеером.
в тестовый поток пишется нормально. подскажите чего поправить?
Попробуйте с опциями поиграть.
Выше, в комментариях, я писал, что пробовал менять.
Должно всё работать.
Всё нормально запускается. Возникла обратная проблема - как остановить сервер.
У меня не работает вот эта строчка:
выполнение данной команды выбрасывает вот такую ошибку:
Что является следствием не верно заданных опций, в man для ffmpeg сказано:
а в вашей команде после флага -i идет только InputFile, а OutputFile файла нет. Вот сижу и не пойму как она у вас могла работать ?
iriz: Вот вам ответ на всякий случай
нет, проще всё же не так, а вот так:
Всегда помните про killall ;) с ним проще
Может кто подскажет, какие параметры задать в Launch ffmpeg..... , чтобы захватывать изображение с рабочего стола, а не с веб-камеры.
Эта команда выполнит захват видео с раб стола:
Вот ещё для примера:
То есть, по аналогии.
Так же посмотрите:
http://zenway.ru/page/screencasting-linux-ffmpeg
Захват по Вашему примеру работает для вывода в файл. А как это прописать в конфиге ffserver, чтобы также транслировать изображение в сеть, как с веб-камеры? Задача стоит следующая: необходимо транслировать на сайт мероприятие, это реализовано как описано Вами выше; также необходимо транслировать презентации, которые будут выводиться через проектор на экран. Идея - запустить два потока на разных портах, на странице будет два окошка - одно выводит зал и лектора со звуком, второе только изображение с рабочего стола компьютера.
А как его под виндой запрустить ?
Команда запуска ffm
Опытным путём подтвердилось, что Launch внутри config'a гораздо капризнее, чем отдельный запуск ffmpeg с записью в файл, читаемый ffserver-ом. Поэтому лучше просто закомментировать строчку с Launch, запустить сервер, затем запустить
При вещании файла разрешение не обязательно указывать, у меня последняя версия программ без проблем как сжимала, так и растягивала картинку. То же самое с форматом, он вроде без проблем определяется автоматически.
Хотел спросить у знающих людей. Умеет ли ffmpeg подключать libavfilter при трансляции видео на ffserver? В частности надо наложить оврелеем картинку.
Сейчас я транслирую RTSP-поток с IP-камеры
Всё работает нормально
Если направить поток с оверлеем в файл
То тоже всё работает нормально.
Но если направить поток с оверлеем в ffserver
то картинки просто нет. С этим что-то можно сделать? Или в ffserver просто нет такого функционала?
я пробовал писать с камеры в файл вместе со звуком вроде сносно, надеюсь чем нибудь вам ето поможет)))
Добрый день!
Столкнулся с проблемой рассинхронизации видео и аудио потоков при захвате с ТВ-тюнера.
Исходные данные:
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
У меня есть 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. Что тут поделать ума не приложу. Спасибо заранее умные люди!